对常量对象值使用赋值而不是相等

时间:2014-05-12 16:55:46

标签: java equals assign

给出如下定义

public interface Type
{
    public static final Type NULL = new Type() { public void method() {} };

    public void method();
}

如果从Type的实现创建对象的所有代码都使用(并检查相等)上面提到的Type.NULL值,是否存在等式检查错误的情况?

例如,假设声明如

public Type calculate() {...}
Type t = calculate();

calculate()的返回值可能是Type.NULL,只要结果为null,而不是检查

if (t == null)

一个人会检查

if (t == Type.NULL)

因此使calculate()的返回类型始终为非null。

(问题不在于这是否是最佳实践,它只是试图验证此方法不存在任何准确性问题。)

2 个答案:

答案 0 :(得分:1)

另一个选择是创建一个类型为:

的具体NullType子类
class NullType extends Type {
    @Override
    public void method() {
        ...
    }
}

然后您的方法可以返回NullType实例,因此检查将是:

if (t instanceof NullType)

NullType成为单身人士可能也是有意义的。

答案 1 :(得分:1)

从OO设计的角度来看,我会区分两种情况。

  1. 您希望模拟已返回 nothing ,该变量尚未定义值。在这种情况下,我会使用null。我看不到使用if (t == Type.NULL)代替if (t == null)的任何优势。

  2. 您想要建模空操作/值已经返回,变量已定义,但该值是一种"零"。在这种情况下,我会使用您的解决方案,但我不会根据您的业务逻辑将其称为NULL,而是VOIDEMPTY或类似。这不是因为你想使用if (t == Type.NULL)而不是if (t == null),而是因为你想不使用任何 - 你可以只使用它包含的变量

  3. 。一个有意义的(但是空的)值