gpt4 book ai didi

java - 容易出错的 Java 枚举重构

转载 作者:行者123 更新时间:2023-12-04 20:49:32 24 4
gpt4 key购买 nike

我正在重构一些旧代码以使用 enum 而不是 String 常量。当我注意到将 enumString 进行比较时,我正在审查我的代码不会引发异常。我无法删除旧常量,因为其他项目仍在使用它们。

我不能覆盖等号,因为 JLS 特别禁止这样做:

The equals method in Enum is a final method that merely invokes super.equals on its argument and returns the result, thus performing an identity comparison.

代码如下所示:

public enum Gender{
MALE,
FEMALE
}

// Constants for genders
public static final String MALE = "Male";
public static final String FEMALE = "Female";

//following are obviously false
MALE.equals(Gender.MALE)
Gender.MALE.equals(MALE)

对于常规对象,我可以覆盖 equals 并抛出异常,但对于我的示例,它只会返回 false。还有一个像 getGender 这样的方法返回字符串,现在返回一个枚举,所以可能会有我遗漏的地方,并且将字符串与枚举进行比较

这很容易出错。 FindBugs 也没有报告任何错误。无论如何,我可以防止这种情况发生吗?

最佳答案

如评论中所述,Object#equals(...) 不是类型安全的。您无法阻止您的 API 用户将错误类型的对象传递给它。在这种情况下,它应该简单地返回 false。如果有人这样做,最终他们会注意到它总是返回 false 并去寻找错误。

您应该弃用 String 常量以引起人们对首选做事方式的注意:

/**
* New code should use {@link Gender#MALE}.
*/
@Deprecated
public static final String MALE = "Male";
/**
* New code should use {@link Gender#FEMALE}.
*/
@Deprecated
public static final String FEMALE = "Female";

关于java - 容易出错的 Java 枚举重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31928528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com