2017-01-23 57 views
1

我想知道這些類之間的差異,在我的應用程序中,我需要設置一些參數並通過方法傳遞對象。我有一些接口只有方法(主要是DAO /工廠方法)。我對我的代碼有一些疑問。類和具體類

  • 我應該只使用接口和具體類嗎?
  • 或使用類(使用Getter和Setter)並僅實現方法?
  • 我應該混合它們嗎?是不好的做法?

接口:

public interface Animal { 
    void roar(); 
} 

混凝土類具有實現的方法從接口

public Lion implements Animal { 
@overrride 
void roar(){ 
    //roar like lion! 
    } 
} 

混凝土等級:我有這樣一個構造對象,使DAO操作。

public class Lion { 
    private String lionName; 
    getter and setter... 
    void roar(){ 
//Roar like Lion. 
} 
} 

摘要:

abstract class Lion { 
    abstract public void abstractRoar(); 
} 

由於提前,像往常一樣,你的幫助是真正讚賞。

+0

你不能在接口中實現方法 –

+1

反正我覺得你缺少'抽象類'示例 –

+0

@ cricket_007 Ohh對不起,我的壞。編輯。 –

回答

1

如果我的理解是正確的,你的問題是:

我需要每次都實現一個接口創建一個類?

答案是否定的。接口僅用於抽象。如果幾個類共享通用方法,使用一個接口將簡化代碼。

有關接口的更多信息(我應該何時使用,我該如何使用),請參閱有效Java(第19項)一書。這裏是一個鏈接:

Effective Java Item 19

。希望解決您的問題。

+0

謝謝,我看這本書。 –

+0

非常感謝你的回答幫助了我很多。 –

0

他們每個人都有,你需要決定從看哪個適合您的需求更好地不同的使用情況。

一個interface的一般目的是定義的一組可跨越幾個/許多類來實現,並且重複使用相關方法。對於你的動物的例子,在我看來,我會讓Animal成爲一個父級,可以通過Lion,Tiger,Bear等等級進行擴展。這個用例的接口可以是沿着Noises的行。每個動物可能有不同的聲音,但是,他們都不製造噪音。該接口可以有growlroarsniff

+0

感謝您的澄清。我可以使用我的Class'Lion'和它的getter/setter來構造對象並解決接口問題嗎?或者我需要在實現'Animal'的類中設置實例變量? –

+0

@JuanSebastianOsorio我對你的意思有點困惑。您需要在構造函數中設置類的實例變量,或者在實例化後通過setter設置該類的實例變量。 –

+0

我剛剛發佈了部分代碼。謝謝你的幫助。 –

0

我有這樣的事情:

類用戶:

public class Users { 

private int userId; 
private String userPassword; 
private int userProfile; 
private String userName;  
private String userPosition; 
private int userCencos; 
private String userOffice; 

public Users(int userId, String userPassword, int userProfile, String userName, String userPosition, int userCencos, String userOffice) { 
    Constructor.. 
} 

public String getUserOffice() { 
    return userOffice; 
} 
more getter/setter ... 

接口:

public interface UserDAOInterface { 

    public int insert(Users user) throws SQLException; 
    more DAO Operations... 
} 

DAO用戶:

public class UserDAOConcrete implements UserDAOInterface { 

private int result;  
public PreparedStatement query; 

@Override 
public Users login(int userId, String password) throws NumberFormatException , SQLException{ 

    SQL sql = new SQL(); 
    try {    

     PreparedStatement loginQuery = sql.createPStatement(cf.SELECT_USER_BY_LOGIN_DATA); 
     loginQuery.setInt(1, userId); 
     loginQuery.setString(2, password); 
     System.out.println(loginQuery.toString()); 

     try { 
      ResultSet resultSet = loginQuery.executeQuery(); 
      if (!resultSet.isBeforeFirst()) { 
       loginQuery.close(); 
       sql.dbConection().close(); 
       throw new NullPointerException("Usuario No encontrado"); 
      } 
      while (resultSet.next()) { 
       Users newLoggedUser = new Users(); 

       newLoggedUser.setUserId(resultSet.getInt("UserId")); 
       newLoggedUser.setUserCencos(resultSet.getInt("CostCenter_CostCenterId")); 
       newLoggedUser.setUserProfile(resultSet.getInt("Profiles_ProfileId"));      
       newLoggedUser.setUserName(resultSet.getString("UserName")); 
       newLoggedUser.setUserPosition(resultSet.getString("UserPosition")); 
       newLoggedUser.setUserOffice(resultSet.getString("UserOffice")); 
       resultSet.close(); 
       loginQuery.close(); 
       sql.dbConection().close(); 
       return newLoggedUser; 
      } 
     } catch (SQLException | NullPointerException | NumberFormatException e) {     
      throw e; 
     } finally { 
      try { 
       loginQuery.close(); 
       sql.dbConection().close(); 
      } catch (SQLException e) { 
       System.out.println("SQL Error: " + e); 
      } 
     } 
     return null; 
    } catch (SQLException ex) { 
     System.out.println("SQL Error: " + ex); 
    } 
    return null; 
}  

DAOFactory:

public class UserDAOFactory { 

public static UserDAOConcrete getUserDAO(String type) { 
    if (type.equalsIgnoreCase("user")) { 
     return new UserDAOConcrete(); 
    } else { 
     return new UserDAOConcrete(); 
    } 
} 

調用方法:

UserDAOConcrete userDAO = UserDAOFactory.getUserDAO("user"); 
Users userData = userDAO.login(Integer.parseInt(loginUserId.getText()), String.valueOf(userLoginPassword.getPassword()));  
//Do whatever you need with the Object userData. 

正如你可以看到我有一個的getter/setter和接口類的混合,工作正常,我應該做我的代碼一樣這個?。