- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD})
public static @interface Property { String value(); }
public static class PropertyImpl implements Property {
private final String value;
public PropertyImpl(String value) { this.value = value; }
@Override public Class<? extends Annotation> annotationType() { return Property.class; }
@Override public String value() { return this.value; }
@Override public int hashCode() { return (127 * "value".hashCode()) ^ value.hashCode(); }
@Override public boolean equals(Object o) {
if (!(o instanceof Property)) { return false; }
Property other = (Property) o;
return value.equals(other.value());
}
}
отформатировал для компактности.
Идеи для чего делать реализцию аннотации?
@Test(expectedException = TirTupitException.class)
http://upload.wikimedia.org/wikipedia/commons/5/5c/Michael_Pacher_004.jpg
а лучше анекдот (осторожно, скотоложство!):
Наташа Ростова спрашивает у поручика Ржевского:
-поручик, расскажите, чем вы вчера занимались?
-ну, например, вчера мы ебали лошадей...
Наташа в слезах убегает и жалуется капитану:
-фу, капитан, поручик Ржевский такой пошлый, низкий человек!
Капитан:
-низкий?? вот уж нет! например, мы вчера лошадей ебали. Так вот, все на табуретах, а он таак!
в общем, мы мордой не вышли, не завшивоинтеллегентили до ее уровня.
это что-то из ролевых игр?
плюсанул.
Понятно, что делать этого руками не нужно ни при каких обстоятельствах. Интересен ответ...
есть мнение, что аннотации в яве изуродовали язык, что они там не нужны, запутывают логику и вообще развращают.
Начинаю потихоньку подумывать о переходе на c++...
"value".hashCode() - отдельная няшечка.
П. С. это вам не getFillColor().length() > 0 )))))))
В команде джуниор?
Создаем final Property checkerExample=new PropertyImpl ("adequate");
Потом, значит, достаем откуда-то рефлексией аннотацию типа Property, которую мы написали в коде.
@Property ("mudak") User animeGovno;
Property mudakAnno=Govnokod.class.get...(...);
И сравниваем, для этого собстно hashCode и equals.
assert(!checkerExample.equals(mudakAnno) );
Примерно так.
static boolean equals(...) рулит.
Впрочем код не плюсовал.
Цитирую кусок документации:
Guice comes with a built-in binding annotation @Named that uses a string:
To bind a specific name, use Names.named() to create an instance to pass to annotatedWith:
П. С. Что самое прикольное оказалось - "... hashCode() specified in the Annotation Javadoc" :)
Вот это
http://www.cs.rice.edu/~mgricken/research/xajavac/
действительно круто.
Возможность писать так, не бенефит?
@interface And extends InvariantAnnotation {
InvariantAnnotation[] value();
}
@Or({@And({@OnlyThreadWithName("foo"), @OnlyEventThread}),
@OnlyThreadWithName("bar")})
void f() { }
>и в чем заключается крутость?
в совместимости с жавой
прямо как в http://govnokod.ru/6663
@OnlyThreadWithName("bar")})
void f() { }
по мне - это просто ЖЕСТЬ.
Clojure решает подобные проблемы отсутствием лишних абстракций: метаинформация символов представляется там в виде обычной мапы.