Дубликат аннотации java 7 [dубликат]

Самое быстрое (не внутреннее / неассемблерное) решение для этого - найти младший байт, а затем использовать этот байт в таблице поиска с 256 входами. Это дает вам худшую производительность четырех условных инструкций и наилучшего варианта 1. Это не только наименьшее количество инструкций, но и наименьшее количество ветвей, что очень важно для современного оборудования.

Ваша таблица (256 8-разрядных записей) должна содержать индекс LSB для каждого номера в диапазоне 0-255. Вы проверяете каждый байт своего значения и находите самый младший ненулевой байт, затем используйте это значение для поиска реального индекса.

Для этого требуется 256-байтовая память, но если скорость этой функции равна так важно, чтобы 256-байты это достойно,

Например

byte lowestBitTable[256] = { .... // left as an exercise for the reader to generate }; unsigned GetLowestBitPos(unsigned value) { // note that order to check indices will depend whether you are on a big // or little endian machine. This is for little-endian byte* bytes = (byte*)value; if (bytes[0]) return lowestBitTable[bytes[0]]; else if (bytes[1]) return lowestBitTable[bytes[1]] + 8; else if (bytes[2]) return lowestBitTable[bytes[2]] + 16; else return lowestBitTable[bytes[3]] + 24; }
76
задан Max A. 12 October 2009 в 14:45
поделиться

7 ответов

Две или более аннотации одного типа не допускаются. Однако вы можете сделать что-то вроде этого:

  public @interface Foos {Foo [] value ();  } @Foos ({@ Foo (bar = "one"), @Foo (bar = "two")}) public void haha ​​() {}  

Вам понадобится специальная обработка аннотации Foos в коде.

btw, я только что использовал это 2 часа назад для решения одной и той же проблемы:)

128
ответ дан sfussenegger 15 August 2018 в 22:31
поделиться
  • 1
    Можете ли вы также сделать это в Groovy? – Excel20 11 January 2012 в 10:52
  • 2
    @ Excel20 Да. Вы должны использовать квадратные скобки, хотя, например, @Foos ([@ Foo (bar = «one»), @Foo (bar = «two»)]) . См. [D0] groovy.codehaus.org/Annotations+with+Groovy – sfussenegger 11 January 2012 в 15:29
  • 3
    Немного поздно в тот же день, но обратите внимание на советы, которые могут обрабатывать список Foo внутри Foos? На данный момент я пытаюсь переработать результат метода, но, хотя Foos перехвачен, совет Foo никогда не вводится – Stelios Koussouris 5 September 2013 в 06:30

Помимо других упомянутых способов, в Java8 есть еще один более подробный способ:

  @Target (ElementType.TYPE) @Repeatable (FooContainer.class) @Retention (RetentionPolicy.RUNTIME  ) @interface Foo {Строковое значение ();  } @Target (ElementType.TYPE) @Retention (RetentionPolicy.RUNTIME) @interface FooContainer {Foo [] value ();  } @Foo ("1") @Foo ("2") класс @Foo ("3") Пример {}  

Пример по умолчанию получает, FooContainer в качестве аннотации

  Arrays.stream (Example.class.getDeclaredAnnotations ()). forEach (System.out :: println);  System.out.println (Example.class.getAnnotation (FooContainer.class));   

Оба вышепечатаемых:

@ com.FooContainer (значение = [@ com.Foo (значение = 1), @ com.Foo (значение = 2), @ com.Foo (значение = 3)])

@ com.FooContainer (значение = [@ com.Foo (значение = 1), @ com.Foo (значение = 2), @ com.Foo (значение = 3)])

10
ответ дан Jatin 15 August 2018 в 22:31
поделиться
  • 1
    Стоит отметить, что имя метода / поля в FooContainer должно быть строгим с именем «значение ()». В противном случае Foo не будет компилироваться. – Tomasz Mularczyk 5 June 2016 в 11:06
  • 2
    ... также содержащий тип аннотации (FooContainer) не может быть применим к большему количеству типов, чем повторяемый тип аннотации (Foo). – Tomasz Mularczyk 5 June 2016 в 11:16

Как сказал sfussenegger, это невозможно.

Обычным решением является создание «множественной» аннотации, которая обрабатывает массив предыдущей аннотации.

Кстати, это очень удобно использовать в крупных публичных проектах (например, Hibernate), поэтому его нельзя рассматривать как взломать, но это скорее правильное решение для этой потребности.


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

Пример:

  public @interface Foo {String [] bars ();  }  
12
ответ дан KLE 15 August 2018 в 22:31
поделиться
  • 1
    Я знал, что это было странно знакомо. Спасибо, что освежил мою память. – Max A. 12 October 2009 в 14:38
  • 2
    Теперь это возможно с Java 8. – Anix PasBesoin 26 February 2017 в 13:41

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

  @Foos ({"one", "two"}) private String  AWK;  // ... public @interface Foos {String [] value ();  }  
4
ответ дан matt1616 15 August 2018 в 22:31
поделиться

В Java 8 (выпущен в марте 2014 года) можно писать повторяющиеся / дублированные аннотации. См. [D0] http://docs.oracle.com/javase/tutorial/java/annotations/repeating.html .

55
ответ дан mernst 15 August 2018 в 22:31
поделиться

Если у вас есть только один параметр «bar», вы можете назвать его «значение». В этом случае вам не обязательно писать имя параметра вообще, когда вы его используете следующим образом:

  @Foos ({@ Foo ("one"), @Foo ("two")}  ) public void haha ​​() {}  

немного короче и аккуратно, imho ..

3
ответ дан mihahh 15 August 2018 в 22:31
поделиться
  • 1
    Правильная точка, но как эта попытка ответить на вопрос OP? – Mordechai 10 January 2017 в 03:53
  • 2
    @MouseEvent, вы правы, я думаю, что это было скорее улучшение верхнего ответа от sfussenegger и, следовательно, больше в комментариях. Но ответ в любом случае устарел из-за повторяющихся аннотаций ... – mihahh 11 January 2017 в 23:09

http://docs.oracle.com/javase/tutorial/java/annotations/repeating.html

Начиная с Java8 вы можете описать повторяемые аннотации:

  @Repeatable (FooValues.class) public @interface Foo {String bar ();  } public @interface FooValues ​​{Foo [] value ();  }  

Примечание, значение является обязательным для списка значений.

Теперь вы можете использовать аннотации, повторяя их вместо заполнения массива: [ ! d7]

  @Foo (bar = "one") @Foo (bar = "two") public void haha ​​() {}  
14
ответ дан Sergei Pikalev 15 August 2018 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: