2013-12-11 156 views
1

我有下面的課程。java繼承最佳實踐?

public class BaseRequest { 
    protected List<Emp> names; // names property is required in many classes 
} 

public class FirstRequest extends BaseRequest { 

    public FirstRequest() { 
     names = new ArrayList<Emp>(); 
    } 

    public setNames(List<Emp> names){ 
     super.names = names; 
    } 

    public List<Emp> getNames(){ 
     return super.names; 
    } 
} 

public class ServiceClass { 

    public void someMethod(List<Emp> emps) { 
     FirstRequest request = new FirstRequest(); 
     request.setNames(emps); 
     //Some Logic 
    } 
} 

我是以正確的方式繼承嗎?我該如何進一步改進它?

謝謝!

+2

使用'BaseRequest request = new FirstRequest();'而不是'ServiceClass'的'FirstRequest請求' –

+0

@SantoshJoshi然後他需要在超類上聲明getter和setter,雖然它可能是抽象的和實現的他們。 – RamonBoza

+2

爲什麼'Base'在'BaseRequest'中定義,但setter和getter以及'FirstRequest'中的初始化?這可能是有原因的,但除非有意,否則將該代碼移動到'BaseRequest'。 – Thomas

回答

0

如何我可以我進一步提高呢?

移動相關names到基類中的方法,使namesprivate

public class BaseRequest { 
    private List<Emp> names = new ArrayList<Emp>(); 

    public setNames(List<Emp> names){ 
     this.names = names; 
    } 

    public List<Emp> getNames(){ 
     return names; 
    } 
} 

public class FirstRequest extends BaseRequest { 
    // the rest of your stuff 
} 

應該避免使names保護:一個公共的getter應該是夠用了派生類和類的其他用戶。

0

取決於你想要做什麼,對於這段代碼,大部分事情看起來都不錯。 可能要更改

FirstRequest request = new FirstRequest(); 

BaseRequest request = new FirstRequest(); 

而且使用的getter/setter方法在超類。

此外,在FirstRequest的構造函數,你應該跟父類(例如做ArrayList的初始化有)

public FirstRequest(){ 
super(); 
} 

,並在超類

public BaseRequest() 
{ 
// initialisation 
} 
0

你可以將BaseRequest轉換爲接口並僅提供客戶端要使用的方法的簽名。客戶端應該只對所提供的方法感興趣(api),而不是實現細節然後你可以在所有類中實現它們實現的接口。更靈活的接口:

public interface BaseRequest { 
    List<Emp> getEmps(); 
    void setEmps(List<Emp> list); 
    .... 
} 


public class FirstRequest implements BaseRequest{ 

    List<Emp> getEmps(){ 
     return ...; 
    } 

    .... 
}