Java Annotation - Objects或toString值的数组

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"},有什么建议吗?

dur*_*597 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;
}
Run Code Online (Sandbox Code Playgroud)

这将完成两件事:

  1. 让您可以轻松地为每种不同的过滤器类型执行不同的过滤行为。
  2. @Excludes通过将不同的参数分类到不同的组中,使注释更加清晰。

JavadocEnum.name()说:

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

我建议您尝试告诉您公司的人员阅读开放/封闭原则,并解释为什么在这种情况下违反该原则会造成特别严重的损害。