【问题标题】:== or equals when comparing final static fields比较最终静态字段时 == 或等于
【发布时间】:2014-12-06 18:37:45
【问题描述】:

在与 C# 稍作休息后,我回到了 Java,我已经厌倦了写像 a.equals(b) 这样的东西,所以我想知道是否有一种在不破坏我的程序的情况下使用== 运算符的方法。

这是我的情况:

public static class A {
    public final static A STATIC_FIELD = new A(prop1, prop2);

    public A method(int param){
        return (param > 0.5) ? STATIC_FIELD : new A(prop1, prop2);
    }
}

现在,我可以在下面的 sn-p 中将 equals 替换为 ==,因为我指的是同一个对象还是错了?

....
private bool method(){
    A aInstance = getAInstance();
    int param = Math.Random();
    return aInstance.method(param).equals(A.STATIC_FIELD);
}
....

如果STATIC_FIELD 的值取自enum,该怎么办?

【问题讨论】:

    标签: java operators equals


    【解决方案1】:

    这取决于你想做什么。

    如果您需要检查这是否是完全相同的对象,请使用直接比较。如果您需要检查对象是否包含相同的内容(如字符串或数字),则应使用 .equals。

    这些方法最常见的错误似乎来自字符串比较,如果字符串具有相同的内容,.equals 返回 true,但 == 仅在这是相同的字符串实例时才返回 true。

    【讨论】:

      【解决方案2】:

      您应该避免 ==(好吧,让我们同意您知道它:-)),也与单例实例有关,因为您稍后可能会“忘记”它是通过单例创建的。但我会给你一个提示。而不是:

      if ((var != null) && (var.equals(A.STATIC_FIELD)))
      

      你可以写:

      if (A.STATIC_FIELD.equals(var))
      

      就像许多人没有意识到比较他们可能使用的字符串一样:

      if ("static string".equals(varString))
      

      您也可以使用 java.util.Objects.equals 来比较对象,而无需所有这些检查空值的负担。

      【讨论】:

      • 不,这是一个基本的问题,与 OP 问题无关。
      【解决方案3】:

      不,你不能使用 == 而不是 equals() 因为当我们在 java 中使用 == 时,我们实际上是在比较对象的内存地址,所以如果该方法返回 STATIC_FIELD 那么它将作为静态对象正常工作并且地址到处都是一样的。 但是当方法将返回 A 的新对象时,即使类中的内容相同,地址也不会匹配,因为新的 A(param1, param2) 坚持 JVM 在不同的内存位置创建一个新对象

      【讨论】:

      • 但是在这里,method() 不会返回 A 的新实例(如果为真),它会返回静态字段。
      • 该方法仅在参数值大于 .5 时返回 STATIC_FIELD,否则返回一个新对象
      • 如果你认为它永远是真的,那么你可以使用 ==。但是对对象使用 equals 总是更好
      • 因为他没有在他的类中重写 equals(),所以它无关紧要。 == 将在给定的代码中工作并提供预期的结果。他并不是要比较所创建的新 A 的价值。
      【解决方案4】:

      == 检查两个对象是否是同一个实例。如果您想检查两个变量是否持有相同的实例(如果您将变量分配给类常量,它们很可能是),== 可以使用。如果您的变量恰好包含null,它也不会出错,因此它比.equals() 具有优势。

      enum 的实例总是不变的,两个不同的 实例永远不会相等,所以== 也可以用于这些实例。

      【讨论】:

        【解决方案5】:

        如果你不重写 equals() 方法,equals()== 做同样的事情,检查引用的相等性。您可以在这种情况下进行替换,因为 method() 将在 A.STATIC_FIELD 为真时返回与 A.STATIC_FIELD 相同的引用。见this answer

        【讨论】:

          猜你喜欢
          • 2023-02-11
          • 1970-01-01
          • 1970-01-01
          • 2012-09-29
          • 1970-01-01
          • 1970-01-01
          • 2019-11-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多