通常,在Java/C#中对引用类型变量使用==相等时?

作为一个题为“等于和= =之间的差异”的问题的后续行动:在什么样的情况下你会发现自己在Java / C#中测试参考相等性?
最佳答案
巩固答案……

When, typically, do you use ==
equality on a reference typed variable
in Java / C#?

1.检查null:

if (a == null) ...

2.在构建equals实现时提高效率:

boolean equals(Object o) {
    if (o == null)      return false;
    if (this == o)      return true;

    // Some people would prefer "if (!(o instanceof ClassName)) ..."
    if (getClass() != o.getClass())   return false;

    // Otherwise, cast o, leverage super.equals() when possible, and
    // compare each instance variable ...

3.在比较枚举或比较设计类的对象时的效率,以便比较对象标识等同于检查对象等价(例如,类对象):

enum Suit { DIAMONDS, HEARTS, CLUBS, SPADES }

class SomeCardGame {
    ...
    boolean static isATrumpCard(Card c) {
        return (c.getSuit() == TRUMP_SUIT);
    }
}

4.当你真的打算检查对象身份时,不是对象等价,例如一个测试用例,它希望确保一个类没有放弃对内部数据结构实例的引用.

boolean iChoseNotToUseJUnitForSomeReasonTestCase() {
    final List<String> externalList = testObject.getCopyOfList();
    final List<String> instanceVariableValue =
        getInstanceVariableValueViaCleverReflectionTrickTo(testObject, "list");
    if (instanceVariableValue == externalList) {
      System.out.println("fail");
    } else {
      System.out.println("pass");
    }
}

有趣的是,对于第3点,一篇文章建议使用equals比使用.equals()更安全,因为如果您尝试比较不属于同一类的对象引用(http://schneide.wordpress.com/2008/09/22/or-equals/),编译器会抱怨.

转载注明原文:通常,在Java/C#中对引用类型变量使用==相等时? - 代码日志