假设我们有Book
类,其中包含year_published
个公共字段。如果我想实现NullObject设计模式,我将需要定义NullBook
类,其行为与Book
相同但不做任何事情。
问题是,NullBook
在分配字段时的行为应该是什么?
Book book = find_book(id_value); //this method returns a NullBook instance because it cannot find the book
book.year_published = 2016; //What should we do here?!
答案 0 :(得分:1)
您应该做的第一件事就是将您的财产设为私有。
class NullBook {
private year_published;
// OR solution2 private year_published = null;
public setYearPublished(year_published) {
this.year_published = null;
// OR solution2 do nothing!
}
}
您还可以在父类中定义字段private,因此子项必须实现setter才能访问该字段
class Book {
private year_published;
public setYearPublished(year_published) {
this.year_published = year_published;
}
}
class NullBook extends Book {
public setYearPublished(year_published) {
parent::setYearPublished(null);
}
}
为什么要使用getter和setter? https://stackoverflow.com/a/1568230/2377164
答案 1 :(得分:1)
事情是:模式是关于平衡。是的,一般的好习惯是不返回null,而是让其他人返回;但是好的:返回的内容应该仍然有意义!
在某种程度上,我不知道如何拥有" NullBook"真的有助于您的应用程序的设计。特别是当您允许访问各种内部字段时。你确切地问了一个正确的问题:发布的年份,作者,或者......这样的" NullBook"?! 例如,当某段代码执行"查找"在来自不同"来源的书籍上#34 ;;然后尝试在已发布的一年对这些书进行排序。你肯定不希望你的NullBook成为这些数据的一部分。
因此,我没有看到有这个课程的价值,恰恰相反:我认为它创造了一个有趣的潜力"错误;因此,我的回答是:退后一步,重新考虑一下你是否真的需要这门课程。
还有替换null替换对象的替代方法:也许您的语言允许 Optionals ;或者,你重写那些可以返回null的方法...返回一个集合/数组的书;而且有疑问:那个列表/数组只是空的。
长话短说:允许其他课程直接访问私人领域更多是一种导入设计气味;所以你不应该过于专注于NullObjects,而另一方面要放弃信息隐藏等基本内容。