【问题标题】:Help with annotations帮助注释
【发布时间】:2009-01-26 23:20:56
【问题描述】:

Edit--@Uri 正确指出这是对注解的滥用;试图在注释中实际创建菜单数据本身是愚蠢的。

它们非常适合绑定,但我想我会坚持使用它们将文本数据链接到方法(@Menu ("File") 部分),因为它比反映到方法名称更明确和灵活.我也学到了很多东西。几天后我会在这里发布代码作为答案。

--原帖--

我没有使用这些新奇的注释,但它们看起来非常有趣。我在弄清楚语法时遇到了麻烦(或者更恰当地说,是使用它的最佳方式)。

在写一些代码来回应question 我突然想到我的方法已经过时了。

我曾经解析一个字符串来定义我的方法结构,然后使用反射将它传递给类,但我认为注释可以使菜单结构更好。

我想将文件中的测试类替换为如下内容:

@TopMenu("File,Edit")
@Menu(name="File","Save,Load,Print,Preview,Quit")
@Menu(name="Print","Preview,Print")
@Menu(name="Edit","Copy,Paste")

public class TestMenu {
    @MenuItem ("Save")
    public void save() {
        System.out.println("saved");
    }
    @MenuItem ("Load")
    public void load() {
    System.out.println("loaded");
    }
...

并将整个类传递给一个方法,该方法制造并返回一个绑定到类实例的 JMenuBar,而无需进一步输入。

第一个问题是我不知道如何传递字符串的“默认值”,他们都想要(属性=“值”)而不是(“值”),可以这样做吗?我可以没有它,但它有点冗长。如果我能去掉括号和/或引号会更好,但我不会屏住呼吸(我认为这样做我必须为每个菜单项定义一个单独的界面,这是不可接受的)。

其次,它不喜欢单个类上的多个@Menu 标签。我可以通过解析一个字符串来解决这个问题,但我想知道是否还有其他方法。

最重要的是,是否有一个库已经这样做了? (如果没有人想出一个,我会在它工作时将代码发布到这个线程,以防其他人感兴趣。)

【问题讨论】:

    标签: java user-interface swing reflection annotations


    【解决方案1】:

    我知道我会因此而被否决,但我真的认为人们开始过度滥用 Java 中的注释机制。

    它的设计目的只是作为一种机制,为编译器或编程支持工具(例如,测试基础设施、模型检查器、代码生成器等)提供有关类和方法的元信息

    它不适用于实际的面向生产的代码、宏元编程等等。这与在 C 中使用预处理器宏而不是实际函数一样不雅。

    如果菜单是您程序中的一流实体,我真的认为您不应该为它们使用注释机制。

    对于您的具体问题,您可以轻松定义默认值。但是,您不能开始执行嵌套注释之类的操作来克服菜单问题。它真的不是为此而设计的。

    【讨论】:

    • 有趣的观察。我开始考虑使用注释来促进我的菜单的绑定过程,让他们自己定义菜单只是第二步。它比绑定到方法名称要好,比重复的“new Menu()”代码要好。其他选择?
    • 好吧,您可以将注释用作生成实际代码的自定义“菜单绑定生成器”的输入。但是我看不出这与其他表示/逻辑分离技术(例如 XAML)有什么不同,并且如果您经常使用它,可以节省大量样板代码。
    • 在这种情况下,如果真的有必要,我会使用 XML。在诸如 Hibernate 之类的代码已经到位的情况下,注释比 XML 更有意义。但是,我们在这里讨论的是生成 UI 元素。
    • 虽然我以前使用过 XML/字符串绑定(如链接中的示例代码),但如果它位于不同的文件中,会很烦人。另一方面,这种方法实际上是不可能实现的。唔。也许是 XML 和注解的组合用于绑定?
    • 我不确定我理解你的意思。为什么 XML 更难国际化?如果有的话,通过将 UI 标签作为注释,您将自己绑定到特定版本。你不能编写从 XML 生成菜单类的代码吗?
    【解决方案2】:

    我见过附加多个注解的方式是使用容器注解,然后将项指定为数组。

    @Retention(RetentionPolicy.RUNTIME)
    public @interface Menu {
        String name();
        String[] children();
    }
    
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MenuBar {
        Menu[] value();
    }
    
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MenuItem {
        String value();
    }
    
    @MenuBar(
        {
            @Menu(name="File", children= {"Save","Load","Print","Preview","Quit"}),
            @Menu(name="Print", children= {"Preview","Print"}),
            @Menu(name="Edit", children= {"Copy","Paste"})
        }
    )
    public class TestMenu {
        @MenuItem ("Save")
        public void save() {
            System.out.println("saved");
        }
    
        @MenuItem ("Load")
        public void load() {
            System.out.println("loaded");
        }
    }
    

    【讨论】:

    • 太棒了。我通过使用“value()”找出了默认的东西,如果我把它和这个结合起来,这应该会让事情变得更容易。现在我必须弄清楚如何阅读它们......谢谢。
    【解决方案3】:
    • 您可以定义注释的默认值 - 这里是示例String str() default "text";
    • 你不能轻易克服这个问题。您可以定义注释Menus,它接受字符串数组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2015-03-19
      相关资源
      最近更新 更多