2012-06-06 4 views
1

Предположим, что мне нужно создать объект следующим образом и установить некоторые значенияУправление при создании объекта

FileMetaData fileMeta = fileContainer.getMetaData(); 

    fileMeta.setFileName("file name"); 
    fileMeta.setServer("my box"); 
    fileMeta.setDirectory("/path/to/dir"); 
    fileMeta.setFileType(FileType.PROPERTIES); 

позже я намерен использовать эту ссылку на объект, чтобы сделать что-то полезное.

Я хотел бы признать тот факт, что возможно для пользователя системы, чтобы не установить некоторые поля, например, один может забыть

fileMeta.setDateModified(12345); 

ли это как-то можно гарантировать, что все (или некоторые конкретные) поля перед тем, как сделать объект доступным?

+0

Что именно означает «сделать объект доступным»? – NPE

+0

Является ли объект singleton? Если это - вариант одноэлементного шаблона может дать изящное решение. – amit

ответ

2

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

FileMetaData fileMeta = new FileMetaDataBuilder(fileContainer.getMetaData()) 
    .setFileName("file name") 
    .setServer("my box") 
    .setDirectory("/path/to/dir") 
    .setFileType(FileType.PROPERTIES) 
    .build(); 

Метод build() может гарантировать, что все необходимые поля задаются перед вызовом соответствующего конструктора FileMetaData со всеми необходимыми параметрами.

1

Используйте шаблон строителя и передайте ссылку строителю. Когда вы закончите добавлять дополнения наверху, вызовите .build и захватите возвращенный экземпляр FileMetaData.

Вы можете ограничить это, не дойдя до успеха, пока не будут установлены все предварительные условия.

+0

[Описание шаблона Builder] (http://www.oodesign.com/builder-pattern.html) –

+0

Мне это нравится. Благодаря! – JAM

0

В принципе, я могу классифицировать следующие 3 способа.

Первый основан на самом классе. Вы можете добавить метод isReady() в свой класс. Этот метод выполнит все проверки и вернет true или false.

Другой способ - использовать шаблон Factory или Builder и, возможно, репозиторий объектов. Как фабрика, так и строитель гарантируют создание объекта в готовом состоянии. Репозиторий можно использовать для «публикации» готовых объектов, поэтому другие объекты кода запрашивают и принимают их только в состоянии готовности.

Другой подход - использовать шаблон Wrapper (Decorator).

interface Foo { 
    public void foo(); //business method 
} 

class FooImpl implements Foo { 
    public void foo(){} // does the work 
} 


class FooDecorator implmeents Foo { 
    Foo foo; 
    public void foo(){ 
     if (isInitialized()) { 
      foo.foo(); 
     } 
     throw IllegalStateException("Not initialized"); 
    } 
} 

Эти решения могут быть реализованы с использованием динамического прокси или с использованием инфраструктуры AOP.

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