java - 使空对象不可变的任何标准模式或策略

标签 java design-patterns

在java中,我们更喜欢null object模式,而不是在所有引用中进行非空检查而使代码变得困惑。最近,我们遇到了通过保留 singleton 对象来使用 null 对象 的问题。
假设我们有如下的 Person

public class Person {
 public String firstName;
 public String lastName;
 public boolean isNull() {
  return false;
 }
 public static final Person NULL = new Person() {
  public boolean isNull() { return true; }  
 }
}

在这种情况下,虽然我已将 NULL 对象声明为 Final,但我仍然可以修改成员变量及其全局可用。

Person nullRef = Person.NULL;
Person.NULL.firstName = "sample";
System.out.println(nullRef.firstName);

在本例中,它只有三个字段,我可以通过重写这三个 getter 方法来解决可变性问题。但实际上,有很多字段很难覆盖所有相应的 getter 方法。
是否有任何标准模式或策略来解决 NULL 对象中的这种可变性问题?

最佳答案

使用 Google Guava 库中的可选内容

Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5

引用库文档:

Besides the increase in readability that comes from giving null a name, the biggest advantage of Optional is its idiot-proof-ness

这是处理空对象的更自然的方式

Optional Google Guava

关于java - 使空对象不可变的任何标准模式或策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13681246/

相关文章:

java - 使用 Java 使用 BouncyCaSTLe 生成 X509Certificate

java - ADF : how to remove values set to the view criteria

c++ - 基于模板的主题观察者模式——我应该使用 static_cast 还是 dynamic_cast

c++ - 单例场景,重载不同参数的getInstance?

python - Python 中父类方法生成其子类实例的设计是否错误?

java - 图像堆叠在一起

java - 类未找到异常 : how to find dependency conflict in Java

java - Collections.shuffle的有效性

c# - 使用 new 运算符创建对象/依赖项与使用 DI 容器

java - 像语法、设计模式一样解析 SQL