2010-01-15 3 views
2

Вот что я понимаю до сих пор:Java-бобы, аннотации: что они делают? Как они мне помогают?

Java beans - это просто помочь другим вещам (визуальным вещам?) Взаимодействовать с вашим кодом. Я думаю, что это в основном для UI, потому что это проще визуализировать. Является ли плохая практика использовать Java-компоненты для вещей, отличных от UI?

Java-бобы имеют методы getter и setter (плохая практика ООП) и являются сериализуемыми.

Что касается аннотаций, я думаю, что пользовательские аннотации не предоставляют никаких функций. Некоторые аннотации, например, @depretiated повышают предупреждения компилятора. Могут ли пользовательские аннотации сделать это как-то? Являются ли пользовательские аннотации полезными для чего угодно, кроме документации? Как я могу их использовать? Есть ли у eclipse или intellij какая-то особенность, которая включает аннотации?

Удачные выходные.

Джейк

Update:, что начинает делать больше смысла. Может ли кто-нибудь назвать меня примером того, когда было бы целесообразно использовать формат java bean, и когда это не будет?

Также я читал, что несколько классов могут быть фасолью, и это способ упаковки классов.

Просто уточнить еще одну вещь. Я на 95% уверен, что быть компонентом java - это как одноэлемент (или другой шаблон). Это не влияет на то, что делает компилятор.

+0

Как метод приемника/сеттера плохо работает с ООП? Это не имеет никакого смысла. Разве вы не просто означаете, что они слишком многословны/шаблоны? Затем просто используйте достойную среду IDE, которая может автоматически генерировать все эти вещи за вас несколькими щелчками мыши с именами свойств только в качестве входных данных. – BalusC

+0

Некоторые утверждают, что некоторые применения геттеров/сеттеров нарушают принцип инкапсуляции ... т. Е. «Не запрашивайте информацию, необходимую для выполнения работы, спросите объект, у которого есть информация, чтобы выполнить эту работу за вас». от http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html?page=3. –

+0

@James: Да, это более распространено в DDD. –

ответ

4

Аннотации - это форма declaritive programming. Во-первых, вы должны понять преимущества декларативного программирования до того, как станет понятной утилита аннотаций. По сути, вы можете добавить функциональность или поведение в блок кода, просто «объявив», что он имеет определенную характеристику. Это контрастирует с тем, что на самом деле выписывает ряд утверждений для применения или настройки того же поведения.

JPA annotations - пример добавления функций с аннотациями. Я не знаю «пример, созданный пользователем», но аннотации JPA реализованы точно так же, как вы или я это сделаем.

Что касается Java Beans, их первоначальное использование предназначалось для программирования GUI. «Легкий» способ использования JavaBeans состоял в том, чтобы использовать соглашения об именах для определения «атрибутов» компонента - следовательно, getters и seters. Насколько я знаю, JavaBeans изначально были реализацией для редактирования форм и пользовательского интерфейса на основе графического интерфейса. Таким образом, геттеры и сеттеры упростили программное обеспечение пользовательского интерфейса для обнаружения пользовательских или редактируемых атрибутов. С помощью дескриптора Bean вы можете изменить способ работы дескрипторов ...

Причина, по которой они сохраняются по сей день, - это де-факто способ проверки объектов для публично выставленных объектов. Неплохая форма использования JavaBeans вне GUI. Предпочтение в Java, по-видимому, заключается в использовании конструктора no arg, а затем вложения ваших зависимостей, а не в стиле программирования RAII (не то, что он строго доступен).

Это на самом деле довольно распространено, особенно если объект будет управляемый кодом, который не знает априори объект, с которым он будет манипулировать (посмотрите на пример Hibernate).

+0

Awesome, начинающий ухватиться за Java-компоненты. Но все еще немного шатко, что делают аннотации. Могут ли аннотации влиять на скомпилированный код? Или это просто инструкции для программистов. Работают ли они аналогично интерфейсу (и вынуждают программиста с ошибками компилятора) реализовать определенные методы/следовать определенным стандартам? Было бы лучше открыть для этого новый вопрос? Счастливый понедельник! – sixtyfootersdude

+0

Все вышеперечисленное. Я бы порекомендовал открывать новый Q, специально говорящий об аннотации. –

1

JUnit использует аннотации с версии 4 JUnit. Это пример пользовательских аннотаций. Вы добавляете @ Test-аннотацию к методу, и JUnit-framework распознает его и выполняет этот метод как тест.

Бобы будут использоваться некоторыми фреймами для работы с неизвестными ранее объектами. Примерами, которые мне приходят в голову, являются структуры persistance, они дублируют некоторые зарегистрированные объекты в базах данных и используют для этого свойства bean.

+0

Да, хорошо, это довольно интересно. Я использую версию 3, поэтому я этого не знал. Как JUNIT обнаруживает, что есть аннотация? Могу ли я это обнаружить? (Не знаю, почему я хотел бы это обнаружить, но ..) Спасибо, наслаждайтесь понедельником – sixtyfootersdude

+0

for (Method m : Class.forName(args[0]).getMethods()) { if (m.isAnnotationPresent(Test.class)) { ... } } Похоже, что этот код сделает это. – sixtyfootersdude

+1

Точно, Java-reflection-API также позволяет вам искать аннотации. Это возможность немного расширить язык: вы можете добавить свои собственные аннотации. – Mnementh

2

Я подозреваю, что вы смешиваете Java-компоненты и EJB (Enterprise Java Beans) - это разные концепции. На самом деле сейчас они почти одинаковы, но это не всегда так - история довольно запутанна.

Джеймс дает хорошее объяснение истории Java-компонентов - они намного старше аннотаций (которые были представлены в Java 1.5). EJB также намного старше, но они были радикально пересмотрены и теперь являются в основном Java-компонентами со специальными аннотациями, запущенными в контейнере EJB.

Это на самом деле прекрасный пример того, насколько полезны аннотации.

EJB «старого стиля» (до версии 3 спецификации) были ужасным для кода. Вам необходимо было определить (IIRC) два интерфейса, один класс реализации (который фактически не реализовал интерфейсы) и XML-дескриптор, который их связывал. И если вы сделали опечатку где-нибудь, ошибки компилятора не было - просто полностью критическая ошибка времени выполнения, которая не помогла вам сузить проблему.

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

В спецификации EJB 3.0 это было упрощено радикально, так что теперь вам нужен только один класс (который может быть «классическим» Java-компонентом в случае сущностей-существ), который фактически реализует логику EJB - и аннотации которые сообщают контейнеру EJB, как его обрабатывать. Вместо отдельного XML-файла информация о коде живет рядом с самим кодом в том же файле, и поскольку синтаксис аннотаций проверяется компилятором, во время компиляции обнаруживаются многие потенциальные ошибки.

+0

ОК, поэтому я думаю, что вы говорите, есть два вида фасоли. В EJB аннотации обрабатываются компилятором, но в противном случае они не являются? Означает ли это, что для компиляции EJB вам нужен специальный компилятор? Спасибо за помощь. – sixtyfootersdude

+0

Нет, аннотации EJB обрабатываются контейнером EJB во время выполнения. Но они все еще являются частью кода и проверяются на синтаксические ошибки компилятором (который затем помещает их в файлы классов, где они доступны через отражение). У EJB старого стиля были свои метаданные в дескрипторах XML, которые компилятор Java явно не знал и, следовательно, не мог проверить. –

+0

Аннотации * могут * использоваться для воздействия на компилятор, например. @Override - но это действительно менее важный случай использования, чем аннотации, используемые во время выполнения (поскольку мало кто пишет компиляторы). –

Смежные вопросы