【问题标题】:Java Annotations in narrow scope狭窄范围内的 Java 注解
【发布时间】:2017-03-18 04:59:26
【问题描述】:

如果我们有一个注解用来设置某些特定于类的常量,这样声明:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Tooltip {
  String value();
}

这样使用:

package applicationroot

@Tooltip("createCubeTool.tipText")
public class CreateCubeTool extends EditingTool
{
}

在超类型中使用 this:

public abstract class EditingTool
{
  public String getToolTipText()
  {
    //Don't worry about this, other than that it requires a custom value Per Concrete class.
    return null == tooltip ? null : Translate.text(tooltip.value());
  }
}

注释应该在哪里声明?

撇开关于项目整体结构的问题不谈,我突然想到这个特定的注释只在ModelingTool 类型范围的子类中有用。将它声明在一个完全独立的包中是否有意义,package applicationroot.tool.annotations; 正如一位贡献者所建议的那样,还是最好将其声明为使用它的 ModelingTool 类型的成员?

到目前为止,我发现的所有参考资料都在讨论如何声明自定义注释,而不是它们适合项目整体结构的位置。

【问题讨论】:

    标签: java annotations code-organization


    【解决方案1】:

    一般来说,如果text 由于某些原因是可变的,例如需要在输出之前对其进行格式化或转换,则将其声明为实例成员可能是更好的主意。

    相反,一个确定的CONSTANT可以定义在注解的元信息中。值得注意的是,您必须使用 reflection 来获取可能会降低性能的元信息。 反射带来了很深的调用栈。

    在这种情况下,我认为不值得使用注解。除了表面上优雅的代码之外,重构几乎没有预期的好处。

    【讨论】:

    • 在类级别编写的文本是我们翻译映射系统的关键,并且每个具体类型都有唯一的定义。 (因此调用Translate()
    • 顺便说一句,虽然我很欣赏这些想法并会考虑它们,但它们与我的问题有些正交。我看到最初的问题可能有一些数据过载。我进行了编辑,希望能更清楚地说明我在问什么。
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2017-10-17
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多