Подтвердить что ты не робот

Java Beans: Что мне не хватает?

Мне интересно, не хватает ли чего-то о Java Beans. Мне нравятся мои объекты, чтобы сделать как можно больше инициализации в конструкторе и иметь минимальное количество мутаторов. Beans, кажется, идут прямо против этого и обычно чувствуют себя неуклюжими. Какие возможности я пропускаю, не строя мои объекты как Beans?

4b9b3361

Ответ 1

Похоже, ты на правильном пути. Это не вы, упустивший точку Java Beans, другие программисты злоупотребляют им.

Спецификация Java Beans была разработана для использования с визуальными инструментами. Идея заключалась в том, что разработчик приложения сможет интерактивно настраивать экземпляр объекта, а затем сериализовать (или сгенерировать код) сконфигурированный bean, чтобы он мог быть реконструирован во время выполнения; цель заключалась в том, что во время выполнения он не будет мутировать.

К сожалению, многие разработчики не понимают, что аксессоры нарушают инкапсуляцию. Они используют структуры вместо объектов. Они не видят ничего плохого в других классах, даже в других пакетах, имеющих зависимости от членов данных класса.

Конечно, вам, в общем, придется настраивать экземпляры ваших объектов. Это просто должно быть сделано с помощью какой-то конфигурации. Это может быть контейнер инъекций зависимости, визуальный инструмент стиля BeanBox или просто чтение файлов JSON, XML или свойств, которые вы написали вручную. Ключ заключается в том, что во время выполнения эти объекты эффективно неизменяемы; клиенты просто ссылаются на свои операции, они не имеют доступа к своим свойствам.

Ответ 2

Мне нравятся мои объекты, чтобы сделать так много инициализация в конструкторе как возможно и имеют минимальное количество мутаторов.

Приобретение неизменяемых объектов - разумный выбор. Однако преимущество beans заключается в том, что фреймворки/инструменты/библиотеки могут во время выполнения определять свойства класса, не требуя реализации определенного интерфейса.

Например, предположим, что у вас есть коллекция Person beans, и каждый bean имеет такие свойства, как имя, возраст, высота и т.д.

Вы можете отсортировать эту коллекцию beans по имени (например), используя следующий код:

Collection<Person> myCollection = // initialise and populate the collection
Comparator nameCompare = new BeanComparator("name");
Collections.sort(myCollection, nameCompare);

Класс BeanComparator знает, как извлечь свойство "name" из каждого объекта, поскольку выполняется соглашение Java beans, т.е. вы избавлены от "накладных расходов" на реализацию интерфейса, например:

interface Nameable {
    public String getName();
    public void setName(String name);
}

Еще один пример из Spring MVC - это bean, в котором хранятся параметры URL-адреса. Это можно определить в веб-контроллере (известном как "Действие" в Struts) следующим образом:

public ModelAndView searchUsers(UserSearchCriteria criteria) {
    // implementation omitted
}

Поскольку ожидается, что UserSearchCriteria будет JavaBean, если URL-адрес запроса содержит параметр, такой как maxItems=6, фреймворк Spring знает, что он должен вызывать метод с сигнатурой

void setMaxItems(int maxItems);

В сущности, JavaBeans - это простое соглашение, позволяющее динамически открывать свойства класса во время выполнения (обычно с помощью инструмента или фреймворка), когда неудобно/невозможно знать априорно свойства, которые могут быть предоставлены.

Ответ 3

Я разделяю идею о том, что минимизировать изменчивость - это хорошо. Как уже указывалось, преимущество JavaBeans заключается в том, что они легко обрабатываются с помощью фреймворков.

Чтобы получить лучшее из "обоих миров", я считаю, что хорошим вариантом является использование шаблон Builder, слегка изменяющий Builder для соответствия стандарту JavaBeans. Итак, если вам нужна функциональность фреймворка, которая требует, чтобы ваш класс соответствовал стандарту JavaBeans, вы можете использовать Builder вместо фактического класса.

Ответ 4

Когда вы слышите слово "bean", вы ожидаете увидеть какой-то "контейнер". Идея JavaBean любого типа заключается в предоставлении единого соглашения об интерфейсе для компонентов, которые могут быть добавлены и обработаны во время выполнения. Обычные JavaBeans - это просто самый простой пример: он представляет все возможности интерфейса и является Serializable, что означает, что вы можете создавать экземпляры bean, изменять их, сохранять и перезагружать.

Давным-давно, я пишу редактор Java, содержащий простую "базу данных", представляющую текстовые строки, и имел "подключаемую архитектуру", которая использовала beans. Вы можете добавить поведение в редактор, перетащив bean из хранилища bean и отбросив его в редакторе; как только вы это сделали, поведение (скажем, Cntl-T для транспонирования символов в курсоре) было автоматически доступно в редакторе. beans имел известный интерфейс - они знали, как спросить контейнер о своей структуре данных, и метод doSomething() --- и контейнер знал, что динамически загружает файл класса, создает экземпляр объекта и устанавливает его доступ к базе данных.

Кстати, на самом деле не обязательно, что аксессоры нарушают инкапсуляцию; однако верно, что только потому, что у вас есть член, вам не нужно предоставлять методы get и set для него. Спецификация JavaBean немного неясна в этом; дело в том, чтобы предоставить геттеры и сеттеры для тех вещей, которые должны быть в объекте "контракт".

После того, как интроспекция и размышление были добавлены к языку и действительно поняты, потребность в этих соглашениях была несколько уменьшена; на ранней Java вам нужно было найти соглашение, чтобы найти методы.

Ответ 5

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

Примеры этих инструментов:

Hibernate
JMX