代码之家  ›  专栏  ›  技术社区  ›  Bill K

注释帮助

  •  4
  • Bill K  · 技术社区  · 17 年前

    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");
        }
    ...
    

    并将整个类传递给一个方法,该方法生成并返回绑定到类实例的jmenub,不需要进一步输入。

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

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

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

    3 回复  |  直到 17 年前
        1
  •  2
  •   Kothar    17 年前

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

    @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
  •  4
  •   Uri    17 年前

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

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

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

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

    对于您的特定问题,您可以轻松地定义默认值。但是,您不能开始做像嵌套注释这样的事情来克服菜单问题。它不是为这个设计的。

        3
  •  0
  •   Yoni Roit    17 年前
    • 您可以定义注释的默认值-以下是示例 String str() default "text";
    • 你不能轻易地克服这一点。可以定义注释 Menus 它接受字符串数组