NullObject模式:如何处理字段?

时间:2016-09-13 01:49:20

标签: oop nullpointerexception null null-object-pattern

假设我们有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?!

2 个答案:

答案 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,而另一方面要放弃信息隐藏等基本内容。