4

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

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

——原帖——

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

在编写一些代码来回答这个问题时我突然想到我的方法已经过时了。

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

我想用以下内容替换文件中的测试类:

@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”),这可以做到吗?我可以没有它,但它有点冗长。如果我能去掉括号和/或引号会更好,但我不会屏住呼吸(我认为这样做我必须为每个菜单项定义一个单独的界面,这是不可接受的)。

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

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

4

3 回答 3

4

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

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

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

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

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

于 2009-01-26T23:52:40.103 回答
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");
    }
}
于 2009-01-27T00:17:30.193 回答
0
  • 您可以为注释定义默认值 - 这是示例String str() default "text";
  • 你不能轻易克服这一点。您可以定义Menus接受字符串数组的注释
于 2009-01-26T23:29:48.747 回答