2013-12-11 154 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 ...; 
    } 

    .... 
}