2009-04-15 2 views
5

Я участвую в этом проекте, где мы строим хороший бит устаревшего кода. У меня есть особая ситуация в отношении одного большого объекта java bean, который должен передаваться по проводам. Так что моя первая мысль была, чтобы сделать его неизменным и сериализацию, чтобы сделать трюк. Этим момент я столкнулся с несколькими сложным выбором: -Создание неизменяемых объектов из javabean

  1. В идеале я хочу какое-то образом к автоматически генерировать непреложный, сериализуемые версия этого класса. У меня нет возможности для рефакторинга или изменить этот класс в любом случае, и i действительно действительно ненавидел бы, чтобы скопировать пасту класс с другим именем?

  2. Предполагая, что я дал на 1 т я фактически решил дублировать код ОГРОМНЫЙ класс JavaBean, я до сих пор будет в неприглядной ситуации того, чтобы написать конструктор с некоторыми параметрами 20-25 сделать этот класс непреложный. Что такое лучший способ сделать класс неизменным , кроме инъекции конструктора?

Спасибо и наилучшие пожелания,

+0

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

ответ

4

Чтобы сделать его действительно непреложным, необходимо инициализировать член на время строительства.

Один из способов (и я не говорю, что это довольно!), Чтобы сделать это, и избежать огромного списка параметров в конструкторе - иметь изменяемый тип, который имеет те же свойства. Задайте свойства в изменяемом типе один за раз, через «сеттеры», а затем передайте изменяемый объект в конструктор неизменяемого типа как один аргумент. Неизменяемый объект затем копирует свойства из изменяемого источника в свой собственный (final) участников.

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

Вы можете сделать это еще дальше, создав оболочку, скрывающую реализацию, для интерфейса, который не раскрывает свойств реализации. Оболочка только реализует методы в интерфейсе, делегируя «реальную» реализацию. Установщики и получатели от реализации не присутствуют в обертке. Это приведет к тому, что клиенты просто откатываются от интерфейса к классу реализации и манипулируют свойствами.

+0

Можете ли вы добавить пример кода для каждого из ваших сценариев, я пытаюсь понять и иметь трудное время. – Rachel

1

20-25 свойства не являются огромными для одного, особенно если вы используете полупристойный редактор.

Если у вас уже есть изменяемый экземпляр при построении неизменяемой версии, просто передайте это конструктору.

Если вы хотите быть действительно зло Hacky, использовать java.beans создать serialisable Map для изменяемого класса или подкласса, реализующего Externalizable. В качестве альтернативы вы можете использовать java.beans XML-сериализацию (XML, которая может быть отправлена ​​по сериализации Java ...).

0

Шаг 1: Создайте новый класс и укажите ему переменные экземпляра с теми же именами, что и переменные экземпляра вашего «большого компонента Java-компонента». У этого нового класса не должно быть сеттеров (но только геттеров), чтобы сделать его неизменным.

Шаг 2: Использование Apache Commons BeanUtils.copyProperties скопировать все свойства (то есть переменный экземпляр) из «большого объекта Java Bean» к новому объекту.

0

Несколько идей:

Защищенные сеттеры и фабричные методы Вы можете определить бобы с защищенными сеттеров и в том же пакете, класс фабрики, который принимает все параметры и называет эти сеттеры. Боб является неизменным вне этой упаковки. Чтобы обеспечить это, обязательно закройте банку, чтобы конечные пользователи не могли создавать новые классы в одном пакете.

Примечание: Вы можете использовать мои аннотации JavaDude Bean, чтобы сделать создание проще: http://code.google.com/p/javadude/wiki/Annotations

Например:

@Bean(writer=Access.PROTECTED, // all setXXX methods will be protected 
    properties={ 
     @Property(name="name"), 
     @Property(name="age", type=int.class) 
    }) 
public class Person extends PersonGen { 
} 

Создание добытчиками и конструктор в затмении

затмение некоторые хорошие инструменты, чтобы сделать это быстро:

  1. Создать класс компонента
  2. Добавьте поля, которые вы хотите
  3. правой кнопки мыши в окне редактора
  4. Выберите Source-> Создание методов и сеттер
  5. Нажмите кнопку «Выбрать геттеры» кнопка
  6. Пресс оК
  7. правой кнопкой мыши в окне редактора
  8. Выберите Source-> Создать Конструкторы из полей
  9. Pic к и заказать нужные поля в конструкторе
  10. Нажмите ОК

неизменности декоратора

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

1

насчет простого чтения только интерфейс cotaining методы получения?

Если класс bean - ваш собственный, пусть он просто реализует интерфейс и использует только интерфейс после создания.

Если у вас нет контроля над классом bean, вы также можете создать интерфейс геттера и реализовать его, создав прокси для интерфейса getter с обработчиком invokation, делегирующим все вызовы методов для bean-компонента.

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