在getter中创建一个对象是好的设计吗?

时间:2013-06-11 18:26:25

标签: oop

我有一个bean类,比如教师,其状态为活动非活动,并且每个状态都有一个标识符。为了实现这种行为,我的团队决定让一个Status bean同时包含 id name 属性。

现在,假设我是使用教师 bean的服务的客户端。为了使用所述服务,我必须创建教师 bean:

Teacher teacher = new Teacher();
teacher.setName("Some name");
...
Status status = new Status();
status.setId(1);
...
teacher.setStatus(status);

问题是:如果我们将 Teacher.getStatus()实现为

,那将是一个好的OOP设计吗?
Status status = null;

Status getStatus() {
    if (status != null) {
        return status;
    } else {
        return new Status();
    }
}

因此,无论何时创建教师 bean,我都不会调用状态构造函数。像这样:

Teacher teacher = new Teacher();
teacher.setName("Some name");
teacher.getStatus().setId(1);

这会被视为不良做法吗?如果是这样,为什么?

2 个答案:

答案 0 :(得分:2)

这种做法本身并不差,但在这个例子中似乎没有必要。如果您正在编写getter的对象在构造上有很多开销 - 例如,如果它被从数据库中拉出 - 这种一般方法是非常合理的。但是,有一件事你想解决。不要创建和返回新的Status对象,而是设置this.status=new Status()并返回它。这样,如果您两次调用getStatus(),就不会创建两个新的Status对象。

答案 1 :(得分:1)

我认为在函数中返回new是一个糟糕的设计。它会带给你内存泄漏。每次调用getStatus时,您都会创建一个新状态而不删除它。您可以轻松地使用相同的设计:

Teacher teacher = new Teacher();
teacher.setName("some name");
teacher.getStatus().setId(1);

public class Teacher{
    private Status myStatus = new Status();
    public void Teacher(){...}
    public Status getStatus(){return myStatus;}
}

public class Status{
    private int Id = 0;
    public void Status(){...}
    public void setId(int p_id){Id = p_id}
}