English 中文(简体)
帮忙做注释。
原标题:
  • 时间:2009-01-26 23:20:56
  •  标签:

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

它们对于绑定很好,但是我认为我会坚持使用它们将文本数据链接到方法(@Menu(“文件”)部分),因为它比反射到方法名更明确和灵活。另外,我在与它的搭配中学到了不少。我会在几天内将代码发布在答案中。

原帖

我还没用过这些新潮的注释,但它们看起来非常有趣。但我有些困扰,不知道语法该怎么用(或者更适当地说,该如何最好地使用它)。

在回答这个问题的代码中,我意识到我的方法已经相当过时了。

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

我想用类似下面这样的东西替换文件中的测试类:

@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标记。我可以通过解析单个字符串来解决这个问题,但我想知道是否有其他方法。

最重要的是,已经有一个这样做的库了吗?(如果没有人想出一个,我完成后会在这个帖子上发布代码,以防其他人有兴趣。)

最佳回答

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

@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");
    }
}
问题回答

我知道我会因为这个被踩,但我真的认为人们开始过度滥用Java中的注释机制了。

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

它并不适用于实际的生产代码、宏元编程等。这样做就像在C语言中使用预处理器宏而不是实际的函数一样不雅。

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

关于您的具体问题,您可以轻松地定义默认值。但是,您不能开始像嵌套注释这样的事情来解决菜单问题。它确实不是为此而设计的。

  • You can define default value for annotation - here s example String str() default "text";
  • You can t overcome this easily. You can define annotation Menus which accepts arrays of string




相关问题
热门标签