【问题标题】:Is it good design to create an object inside a getter?在 getter 中创建对象是好的设计吗?
【发布时间】:2013-06-11 18:26:24
【问题描述】:

我有一个 bean 类,例如 Teacher,它的状态为 activeinactive,每个状态都有一个标识符。为了实现这种行为,我的团队决定使用具有 idname 属性的 Status bean。

现在,假设我是使用 Teacher bean 的服务的客户。为了使用上述服务,我必须创建 Teacher 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();
    }
}

所以我不会在任何时候调用 Status 构造函数来创建 Teacher bean。像这样:

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

这会被认为是一种不好的做法吗?如果有,为什么?

【问题讨论】:

    标签: oop


    【解决方案1】:

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

    【讨论】:

    • 您可能还想同步 getter。这样该项目只会被创建一次,即使多个线程访问 getter。
    【解决方案2】:

    我认为在函数中返回 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}
    }
    

    【讨论】:

    • 点得好。现在,关于你刚刚给我的代码。这会被认为是一种不好的做法吗?
    • 我认为这将是一个很好的做法。但是溢出社区应该验证我的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2011-01-07
    • 2012-02-05
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多