我需要编写一个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;
//...
}
我不喜欢使用{"S"}
,有什么建议吗?
答案 0 :(得分:1)
但如果声明
JobType[] values()
,那么我就无法将@Exclude
重新用于其他类型的Enum
。
但这是做你想做的最好的方法。事情就是这样:
Enum
本身毫无意义。它只有在子类化时才有意义。我们假设您要添加其他过滤条件,例如Color
(您自己的自定义Color
枚举,而不是java.awt.Color
)。显然,过滤类过滤JobType
过滤掉Color
的过滤类非常不同!
因此,最好的办法是让你enum
的每个不同时间试图过滤其自己的论点,例如
public @interface Exclude {
JobType[] jobs;
Color[] colors;
Foo[] foos;
Quux[] quuxes;
}
这将完成两件事:
@Excludes
注释更加有用。 Enum.name()
的Javadoc说:
返回此
enum
常量的名称,与其enum
声明中声明的完全相同。大多数程序员应优先使用toString()
方法,因为toString
方法可能会返回一个更加用户友好的名称。 此方法主要用于特殊情况,其中正确性取决于获取确切名称,不会因版本而异。
我建议你试着告诉贵公司的人们阅读Open/Closed principle并解释为什么在这种情况下违反它会特别具有破坏性。