1. Java / Говнокод #8755

    +76

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 06 Декабря 2011

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

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

      @Test(expectedException = TirTupitException.class)
      Ответить
      • пускай бы айтитит илита гамнокода отписалас
        Ответить
        • киса ты што обидилас?
          Ответить
          • он уже боле чем полгода обиженный ходит
            Ответить
            • что вам сделала девачка, что Вы ее так ником?
              Ответить
              • если под хвост заглянуть - там мальчик :(
                Ответить
                • как у зелененького?
                  http://upload.wikimedia.org/wikipedia/commons/5/5c/Michael_Pacher_004.jpg
                  Ответить
                • да это не самое страшное. хуже всего то, что оно на нас еще и обидилос, мол...
                  а лучше анекдот (осторожно, скотоложство!):

                  Наташа Ростова спрашивает у поручика Ржевского:
                  -поручик, расскажите, чем вы вчера занимались?
                  -ну, например, вчера мы ебали лошадей...
                  Наташа в слезах убегает и жалуется капитану:
                  -фу, капитан, поручик Ржевский такой пошлый, низкий человек!
                  Капитан:
                  -низкий?? вот уж нет! например, мы вчера лошадей ебали. Так вот, все на табуретах, а он таак!


                  в общем, мы мордой не вышли, не завшивоинтеллегентили до ее уровня.
                  Ответить
      • ты бы залогинился. ну или глаза протер =)
        Ответить
    • хде сдес с+х?
      Ответить
    • Я заинтригован. Хочу услышать ответ автора, зачем. Если, конечно, автор - не декомпилятор.
      Понятно, что делать этого руками не нужно ни при каких обстоятельствах. Интересен ответ...
      Ответить
      • отвечу чуть позже =) когда все выскажутся и плюсов поднаберем =)
        Ответить
        • На ГК было по крайней мере два любителя ответить позже: 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 )))))))
      Ответить
      • Уже 8 часов прошло. Ждём разгадок!
        В команде джуниор?
        Ответить
        • да-да, хотелось бы, конечно, еще мнение мэтров выслушать. Подожду еще часик, другой =)
          Ответить
          • Известно зачем.
            Создаем 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" :)
      Ответить
      • Я не считаю это большим извращением или какой-то гениальной задумкой с аннотациями, потому не плюсовал.

        Вот это
        http://www.cs.rice.edu/~mgricken/research/xajavac/
        действительно круто.
        Ответить
        • и в чем заключается крутость?
          Ответить
        • не вижу бенефитов
          Ответить
          • >не вижу бенефитов
            Возможность писать так, не бенефит?
            @interface And extends InvariantAnnotation {
            InvariantAnnotation[] value();
            }

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

            >и в чем заключается крутость?
            в совместимости с жавой
            Ответить
            • Annotation-Oriented Programming
              прямо как в http://govnokod.ru/6663
              Ответить
            • @Or({@And({@OnlyThreadWithName("foo"), @OnlyEventThread}),
              @OnlyThreadWithName("bar")})
              void f() { }

              по мне - это просто ЖЕСТЬ.
              Ответить
              • не просто ЖЕСТЬ, а я_нихуя_не_понял - перегруженный код.
                Ответить
              • Да уж, одержимость метаданными ещё никого до добра не доводила.
                Ответить
      • Возможно, это не такой уж и говнокод, как мне показалось сначала. Идея ясна, можно было бы обойтись без извращений и дырок в абстракциях, но тогда API было бы не таким удобным. Ребятам из google наверняка не легко далось это решение :)
        Clojure решает подобные проблемы отсутствием лишних абстракций: метаинформация символов представляется там в виде обычной мапы.
        Ответить
        • угу, поковыряв немного, тоже пришел к выводу, что удобство API сыграло не последнюю роль.
          Ответить
      • Вот в weld например такая техника используется в селекторах. Т.к. нельзя написать просто new Annotation() то приходится писать реализацию интерфейса аннотации...
        Ответить
    • показать все, что скрытоvanished
      Ответить

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