容易出错的Java枚举重构

use*_*187 2 java enums findbugs

我正在重构一些旧的代码来使用enum's而不是String常量.我检讨我的代码时,我注意到,相比enumString将不会抛出异常.我无法删除旧常量,因为其他项目仍在使用它们.

我不能覆盖等于因为JLS特别禁止这个:

Enum中的equals方法是一个最终方法,它只在其参数上调用super.equals并返回结果,从而执行身份比较.

代码如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

对于常规对象,我可以覆盖equals并抛出异常,但对于我的示例,它将返回false.还有一个类似getGender的方法,它返回一个字符串,现在返回一个枚举,所以我可以错过一些地方,并将字符串与枚举进行比较

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

Kev*_*ede 5

如评论中所述,Object#equals(...)不是类型安全的.您无法阻止API的用户将其传递给错误类型的对象.在那种情况下,它应该简单地返回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";
Run Code Online (Sandbox Code Playgroud)