2013-05-03 3 views
2

Пусть у меня есть класс DTO:Как создать неизменяемые DTO без явного использования конструктора?

public class SomeImmutableDto { 

    private final String someField; 
    private final String someOtherField; 

    public SomeImmutableDto(String someField, String someOtherField) { 
     // field setting here 
    } 

    // getters here 
} 

Это хороший неизменны DTO. Но что, если у меня есть 20 полей? Это приводит к распространению множества нечитаемых конструкторов и неподдерживаемого кода.

Существует решение этой проблемы, однако, модель Builder:

public class SomeImmutableDto { 
    private final String someField; 
    private final String someOtherField; 

    private SomeImmutableDto(Builder builder) { 
     // field setting here 
    } 

    public static class Builder { 

     private String someField; 
     private String someOtherField; 

     // setters here 

     public SomeImmutableDto build() { 
      // building code here 
     } 
    } 

    // getters here 
} 

Теперь я могу сделать что-то вроде этого:

SomeImmutableDto dto = new SomeImmutableDto.Builder() 
    .setSomeField(/* ... */) 
    *setSomeOtherField(/* ... */) 
    .build(); 

Теперь у меня есть непреложный DTO, который не имеет изобилие уродливых конструкторов.

Моя проблема заключается в том, что мне нужна DTO, который имеет государственные сеттер И неизменны, потому что есть некоторые унаследованный код в проекте, который не может быть переработан в данный момент, и это требует присутствий общественных сеттеров, чтобы инициализировать DTO объектов ,

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

+1

вы хотите DTO, который является «неизменным» и имеет государственные сеттер ... да? – jtahlborn

+0

Создайте неизменяемую копию (или представление) изменчивого DTO после его инициализации устаревшим кодом? –

+0

Он должен иметь метод, который устанавливает его в неизменное состояние. –

ответ

1

Я думаю, что если вам нужно быть совместимым с устаревшим кодом, лучший способ - использовать не модифицируемую оболочку, как в методе Collections.unmodifiableList.

Это «взломать», но я думаю, что он вынужден унаследованный код, и это «не так уж плохо» :)

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