Jawa / Говнокод #8755 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 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());
    }
}

отформатировал для компактности.
Идеи для чего делать реализцию аннотации?

Запостил: tir tir, (Updated )

Комментарии (50) RSS

  • автор, учи матчасть. У аннотаций могут быть проперти

    @Test(expectedException = TirTupitException.class)
    Ответить
  • Я заинтригован. Хочу услышать ответ автора, зачем. Если, конечно, автор - не декомпилятор.
    Понятно, что делать этого руками не нужно ни при каких обстоятельствах. Интересен ответ...
    Ответить
    • отвечу чуть позже =) когда все выскажутся и плюсов поднаберем =)
      Ответить
      • На ГК было по крайней мере два любителя ответить позже: ursus и alexoy. Судьба их поучительна и печальна!..
        Ответить
    • грубый вброс:
      есть мнение, что аннотации в яве изуродовали язык, что они там не нужны, запутывают логику и вообще развращают.
      Ответить
      • Вы уже знаете, в какой срач хотят превратить java-код с помощью JSR 308?
        public int size() @Readonly { /* ... */ }
        Map<@NonNull String, @NonEmpty List<@Readonly Document>> files;
        Document[][@Readonly] docs2 = new Document[2][@Readonly 12];
        new @NonEmpty @Readonly List(myNonEmptyStringSet);
        class UnmodifiableList implements @Readonly List<@Readonly T> { /* ... */ };
        Начинаю потихоньку подумывать о переходе на c++...
        Ответить
        • никто не заставляет писать код в таком стиле
          Ответить
          • Хорошо говорить так, когда работаешь один. Когда в команде 85 человек, наверняка найдётся десяток-другой человек, стремящихся привнести новый стиль. Я понимаю, что для статического анализа кода, крайне полезного для крупных проектов, это большой бенефит, но читать такой код, на мой взгляд, довольно затруднительно.
            Ответить
            • вот тут полностью с вами соглашусь! всегда найдется человек, который даже код форматировать будет не так как все !
              Ответить
  • судя по переопределённым методам - штоп потом в коллекцию сложить. скорее всего - в hashmap, в виде ключей, а значениями будут обработчики в зависимости от предопределенных value. хотя там логичнее бы смотрелся enum. хотя изврат, конечно, тот еще.
    "value".hashCode() - отдельная няшечка.
    Ответить
  • смотрю из всего актива только roman-kashitsyn хоть как-то выразил свое отношение к коду. а чего другие молчат?

    П. С. это вам не 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(...) рулит.

              Впрочем код не плюсовал.
              Ответить
              • Единственное, чего я опасаюсь - код написал сам tir, и сейчас он начнёт убеждать нас в том, что этот подход хорошо работает, несмотря на то, что код "не следует принятым правилам" (tm).
                Ответить
  • Код не мой, а ребят из неизвестной конторы - Google. Из малознакомого фреймворка - Google Guice. Единственное, что сделал я - переименовал класс, чтобы в глаза не бросалось. В оригинале было не Property, а Named.
    Цитирую кусок документации:
    Guice comes with a built-in binding annotation @Named that uses a string:
    public class RealBillingService implements BillingService {
    
      @Inject
      public RealBillingService(@Named("Checkout") CreditCardProcessor processor,
          TransactionLog transactionLog) {
        ...
      }

    To bind a specific name, use Names.named() to create an instance to pass to annotatedWith:
    bind(CreditCardProcessor.class)
            .annotatedWith(Names.named("Checkout"))
            .to(CheckoutCreditCardProcessor.class);


    П. С. Что самое прикольное оказалось - "... hashCode() specified in the Annotation Javadoc" 🙂
    Ответить
        • >не вижу бенефитов
          Возможность писать так, не бенефит?
          @interface And extends InvariantAnnotation {
          InvariantAnnotation[] value();
          }

          @Or({@And({@OnlyThreadWithName("foo"), @OnlyEventThread}),
          @OnlyThreadWithName("bar")})
          void f() { }

          >и в чем заключается крутость?
          в совместимости с жавой
          Ответить
    • Возможно, это не такой уж и говнокод, как мне показалось сначала. Идея ясна, можно было бы обойтись без извращений и дырок в абстракциях, но тогда API было бы не таким удобным. Ребятам из google наверняка не легко далось это решение 🙂
      Clojure решает подобные проблемы отсутствием лишних абстракций: метаинформация символов представляется там в виде обычной мапы.
      Ответить
      • угу, поковыряв немного, тоже пришел к выводу, что удобство API сыграло не последнюю роль.
        Ответить
    • Вот в weld например такая техника используется в селекторах. Т.к. нельзя написать просто new Annotation() то приходится писать реализацию интерфейса аннотации...
      Ответить
  • с(N.Q"Y(U"J J,G$F S!L.F!K?R.TUX$C)K G!Y)R,K:S:M.V)W,K!Z"N!I?V)UE?C"Q!R,H.A,E?B Q(F PY!C.D?B.K)R"OU B(Z:W!E P?U:G)L!H$H,I)IF.W(Y.P$A$HM I$F?G"B?R E"S S!X(N?W?C X(D,X!J.G,N:IA.AD,A.KNB)B FB$O,B)W)B!L,E$B:D:QA:FS:L!D(K$V O!R:I?J,N F)I"R,I!I?UB"K?O!F.H)O A"X"U(Q$J"FD:T,WK,S.E(O,N)M,Q:K)M U$M.K!N!B$L K)P N!T"P P$S(I(U$Z N"Z?F"G?Z.O?X$Y"G!E Q:R:N?E(M,H D?M$RZ(B)B(P.E,N?J!R!Y(W)E!F(U(XC J)B,H$I(A Y$N"H:F(J:D$A"R:R"D,W(S,U(V!RX"F"H)K!T.J Q"Q)B"Z$F D)A$K$T Q F$NS)X,GH(R:D(V)R?N"L.V:V"I X)C)Y(V?S.R,P Y!M!RM,N O"Z.V,J$X(Q!J.Y(GL?N.F$X N!W!A,IK"C DD:F)BB T,J"FS,S,K:A:M)X!JO?P$PЪQSVFXJVHRWJPQSDBUQMITRZORMKGFGOMTTVCAUQLAVLNONETBWDTLINGFXEKNCNPIHJUQSIUFTKTAFJXEGJVJPAJQFUSVKKDXDVNSPEWWGMGCENAVNOYLOOTYJECGOMPSOTONFMUNUTMIOXHRYPRTUAC
    Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8