use*_*187 2 java enums findbugs
我正在重构一些旧的代码来使用enum's而不是String常量.我检讨我的代码时,我注意到,相比enum于String将不会抛出异常.我无法删除旧常量,因为其他项目仍在使用它们.
我不能覆盖等于因为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也没有报告任何错误.无论如何我可以防止这种情况吗?
如评论中所述,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)
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |