Помогите с аннотациями - PullRequest
       10

Помогите с аннотациями

4 голосов
/ 27 января 2009

Edit - @ 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") вместо just ("value"), это можно сделать? Я могу жить без этого, но это немного многословно. Было бы еще лучше, если бы я мог избавиться от паренов и / или кавычек, но я не затаил дыхание (думаю, для этого мне нужно было бы определить индивидуальный интерфейс для каждого пункта меню, это неприемлемо ).

Во-вторых, ему не нравятся несколько тегов @Menu для одного класса. Я мог бы обойти это, проанализировав одну строку, но мне было интересно, есть ли другой способ.

Самое главное, есть ли библиотека, которая это уже делает? (Если никто не придет с ним, я опубликую код в этой теме, когда он заработает, на случай, если кому-то еще будет интересно.)

Ответы [ 3 ]

4 голосов
/ 27 января 2009

Я знаю, что за это проголосуют, но я действительно думаю, что люди начинают чрезмерно использовать механизм аннотаций в Java.

Все, для чего он был разработан, это быть механизмом предоставления метаинформации о классах и методах для целей компилятора или инструментов поддержки программирования (например, инфраструктуры тестирования, контроллеров моделей, генераторов кода и т.

Он не был предназначен для реального производственно-ориентированного кода, макропрограммирования макросов и всего такого. Это так же не элегантно, как использование макросов препроцессора в C вместо реальных функций.

Если меню являются первоклассными объектами в вашей программе, я действительно не думаю, что вы должны использовать механизм аннотаций для них.

Что касается ваших конкретных вопросов, вы можете легко определить значение по умолчанию. Однако вы не можете начать делать такие вещи, как вложение аннотаций, чтобы преодолеть проблему с меню. Это действительно не было предназначено для этого.

2 голосов
/ 27 января 2009

Способ, которым я видел несколько прикрепленных аннотаций, состоит в том, чтобы использовать аннотацию контейнера, а затем указать элементы в виде массива.

@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");
    }
}
0 голосов
/ 27 января 2009
  • Вы можете определить значение по умолчанию для аннотации - вот пример String str() default "text";
  • Вы не можете легко преодолеть это. Вы можете определить аннотацию Menus, которая принимает массивы строк
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...