返回可变对象的好方法

spa*_*uny 13 java

假设我有一个类Comment,我有一个名为commentDate的私有字段,它是一个java.util.Date,并带有一个名为getCommentDate的getter .

为什么最好返回该日期的副本(返回新日期(commentDate.getTime()))而不是简单地返回该日期...

用户如何更改该Date的对象状态,因为它是getter而不是setter?

Tap*_*ose 14

java.util.Date实现以来,Cloneable您可以轻松克隆日期,如下所示:

public class DateTest {
    private Date date;

    public DateTest() {

    }

    public Date getDate() {
        return (Date) date.clone();
    }

    public void setDate(Date date) {
        this.date = (Date) date.clone();
    }       
}
Run Code Online (Sandbox Code Playgroud)

  • 如果日期是空值怎么办? (3认同)

Kar*_*tel 7

首先,尽量避免使用getter和setter.如果你在同一个领域同时拥有它们,你几乎肯定会做错事.我不在乎Java专家告诉你什么.他们不知道他们在谈论什么.这不是OO的工作方式.OO不是将字段访问转换为方法调用的make-work项目.这实际上并没有封装任何东西.

也就是说:如果你自己返回日期,那么调用代码会引用你的日期对象,并且可以使用它的完整界面.由于日期是可变对象,因此界面包含可以更改对象状态的内容.由于引用是您的日期,您的日期状态将会更改.调用代码如何获得日期(即"带有getter")并不重要.

  • 是啊.`printCommentDateWithGivenDateFormatToGivenFile()`,`convertCommentDateToXml()`,`compareToAnotherCommentAccordingToCommentDate()`等非常方便. (7认同)
  • 你**不**.这是OO的重点.使用Comment实例的人不应该知道有Date字段.那个人不应该**知道这个.Comment类应该公开一个接口,该接口由**用**做有用的东西**. (5认同)
  • 不.你只需"写"一个注释,并将日期格式作为参数传递或已经DI了它.您不会将注释日期单独转换为XML; 你几乎肯定需要将整个注释转换为XML.`compareToAnotherCommentAccordingToCommentDate(Comment other)`更自然地拼写`preates(Comment other)`.同样,调用代码不应该将Comment视为具有日期字段的东西; 因此,包含"CommentDate"的方法名称的概念本身就是可疑的. (3认同)

Tad*_*pec 5

用户如何更改该Date的对象状态,因为它是getter而不是setter?

容易:

Comment comment = new Comment();
comment.getCommentDate().setTime(0); // now it's January 1, 1970 00:00:00 GMT.
Run Code Online (Sandbox Code Playgroud)