为啥在 equals 方法中必须有 2 个 return 语句

Posted

技术标签:

【中文标题】为啥在 equals 方法中必须有 2 个 return 语句【英文标题】:Why 2 return statements are mandatory in equals method为什么在 equals 方法中必须有 2 个 return 语句 【发布时间】:2014-08-06 06:54:23 【问题描述】:
public class MyStuff 
    String name;

    MyStuff(String n) 
        name = n;
     

    public static void main(String[] args) 
        MyStuff m1 = new MyStuff("guitar");
        MyStuff m2 = new MyStuff("tv"); 

        System.out.println(m2.equals(m1));
    

    public boolean equals(Object o) 
        MyStuff m = (MyStuff) o;

        if (m.name != null)
            return true;

        return false;
    

当我删除其中一个返回语句时,编译器给出错误:此方法必须返回布尔类型的结果

【问题讨论】:

修复缩进会有所帮助。 return true 是一个 CONDITIONAL return,由上面的 if(m.name != null) 语句定义。 如果你使用java,使用作为if子句! if 不需要花括号。但是,如果您不使用它们,则在 if 语句中只考虑下一行。 省略 可能会导致以后出现许多错误。我在编辑别人的代码时遇到过很多次。始终使用括号。 我认为这是个好问题。他是一个新手,现在他可能是一个更好的新手。 【参考方案1】:

return true 仅在if 条件为真时执行。对于所有其他情况,您需要return false

【讨论】:

【参考方案2】:

这很明显,因为您的代码实际上是

....
    MyStuff m = (MyStuff) o;
    if(m.name != null)
    
        return true;
    
    return false;

请使用括号,并在项目 -> 属性 -> Java 代码样式 -> 格式化程序 -> 配置工作区设置 -> 新建 -> 制作一个实际上很好的配置文件 -> 应用 -> 按 Ctrl+ 设置 Eclipse 格式化程序代码中的 Shift+F。

其实我个人推荐Eclipse下面的Formatter设置,就是我用的那个:https://dl.dropboxusercontent.com/u/4363931/BestEclipseFormatterSettings.xml

【讨论】:

【参考方案3】:

如果你的情况真的这么简单,那么只返回比较结果会简单得多:

return m.name != null;

进行布尔比较然后单独使用 if 块返回结果确实没有任何价值。

【讨论】:

【参考方案4】:

如果只使用一个 return 语句,则 equals() 将仅在 m.name!=null 时返回结果,否则该方法没有任何其他 return 语句。所以编译器给出了错误。

【讨论】:

以上是关于为啥在 equals 方法中必须有 2 个 return 语句的主要内容,如果未能解决你的问题,请参考以下文章

java中equals的小问题,不知道为啥,有谁能说说么?

java中重写Object类的equals方法为啥要重写hashcode方法?不重写可以吗?

JAVA中,为啥object对象中的equals方法比较的是同一,而String对象比较的是相等?

为啥在使用带有 next() 和 nextLine() 的 Scanner 读取 2 个看似相同的字符串时得到 equals() == false?

【彻底理解】 为啥重写equals()方法为啥要重写hashCode()方法

java中重写Object类的equals方法为啥要重写hashcode方法?不重写可以吗?