Java Annotation - 对象或toString值的数组

时间:2015-07-06 11:36:03

标签: 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;
    //...
}

我不喜欢使用{"S"},有什么建议吗?

1 个答案:

答案 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;
}

这将完成两件事:

  1. 让您轻松为每种不同的过滤器类型执行不同的过滤行为。
  2. 通过将不同的参数分组到不同的组中,使@Excludes注释更加有用。
  3. Enum.name()的Javadoc说:

      

    返回此enum常量的名称,与其enum声明中声明的完全相同。大多数程序员应优先使用toString()方法,因为toString方法可能会返回一个更加用户友好的名称。 此方法主要用于特殊情况,其中正确性取决于获取确切名称,不会因版本而异。

    我建议你试着告诉贵公司的人们阅读Open/Closed principle并解释为什么在这种情况下违反它会特别具有破坏性。

相关问题