Ada*_*ath 9 java annotations coding-style
我需要编写一个Annotation来从结果集中排除某些值.
背景:
从字段中选择不同的值,并在ComboBox中列出.一些遗留值是Deprecated,我不想显示它们,即使它们是由JDBC返回的SELECT DISTINCT().它就像一个迷你框架,人们可以通过单击ComboBoxes中的值来构建选择查询.
我尝试了以下(代码不编译 - 注释行是我尝试解决问题的方法):
public enum JobType {
//...
S,
//...
}
public @interface Exclude {
Object[] values(); // Invalid type
Enum[] values(); // Invalid type again
String[] values(); // Accepts but see the following lines
}
@Table(name = "jobs_view")
public class JobSelectionView extends View {
//...
@Exclude(values = {JobType.S.toString()}) // Not a constant expression
@Exclude(values = {JobType.S.name()}) // Not a constant expression ?!?!?!
@Exclude(values = {"S"}) // Works but... come on!
@Enumerated(value = EnumType.STRING)
@Column(name = "type")
private JobType type;
//...
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢使用{"S"},有什么建议吗?
但如果声明的
JobType[] values()话我将无法将其重用于@Exclude其他类型的Enum.
不过,这是做你想做的事的最佳方式。事情是这样的:
Enum本身是没有意义的。它只有在子类化时才有意义。假设您想添加另一个过滤器Color(您自己的自定义Color枚举,而不是java.awt.Color)。显然,您的过滤类所做的事情对于过滤JobType与过滤非常不同Color!
因此,最好的办法是让enum你尝试过滤自己的论点的每个不同时间,例如
public @interface Exclude {
JobType[] jobs;
Color[] colors;
Foo[] foos;
Quux[] quuxes;
}
Run Code Online (Sandbox Code Playgroud)
这将完成两件事:
@Excludes通过将不同的参数分类到不同的组中,使注释更加清晰。JavadocEnum.name()说:
返回该常量的名称
enum,与其声明中所声明的完全相同enum。大多数程序员应该优先使用该toString()方法而不是该方法,因为该toString方法可能会返回一个更用户友好的名称。此方法主要设计用于特殊情况,其中正确性取决于获取确切的名称,该名称不会因版本而异。
我建议您尝试告诉您公司的人员阅读开放/封闭原则,并解释为什么在这种情况下违反该原则会造成特别严重的损害。