帮助注释

时间:2009-01-26 23:20:57

标签: java user-interface swing reflection annotations

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

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

- 原帖 -

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

编写一些代码来回应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而没有进一步的输入。

第一个问题是我无法弄清楚如何传递一个字符串的“默认”,他们都想拥有(attribute =“value”)而不仅仅是(“value”),这可以做到吗?我可以没有它,但它有点冗长。如果我能摆脱parens和/或引号会更好,但我没有屏住呼吸(我想这样做我必须为每个菜单项定义一个单独的界面,这是不可接受的)。

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

最重要的是,是否有一个图书馆已经这样做了? (如果没有人提出一个,我会在我开始工作的时候将代码发布到这个帖子中以防其他人感兴趣。)

3 个答案:

答案 0 :(得分:4)

我知道我会为此付出代价,但我真的认为人们开始过度使用Java中的注释机制。

它旨在成为一种机制,用于为编译器或编程支持工具(例如,测试基础架构,模型检查器,代码生成器等)提供有关类和方法的元信息。

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

如果菜单是程序中的第一类实体,我真的不觉得你应该为它们使用注释机制。

至于您的具体问题,您可以轻松定义默认值。但是,您无法开始执行嵌套注释以克服菜单问题。它真的不是为此设计的。

答案 1 :(得分: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");
    }
}

答案 2 :(得分:0)

  • 您可以为注释定义默认值 - 此处为示例String str() default "text";
  • 你无法轻易克服这个问题。您可以定义接受字符串数组
  • 的注释Menus