2

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が必要なことです。

ここで使用できるパターンはありますか、それともうまくいきませんか? Proxy パターンについて考えていますが、醜いハックのように見えない方法で適用できるかどうかはわかりません。

4

1 に答える 1

2

レガシーコードに準拠する必要がある場合は、 Collections.unmodifiableList メソッドのように変更不可能なラッパーを使用するのが最善の方法だと思います。

それは「ハック」ですが、レガシーコードによって強制されたものであり、「それほど悪くはない」と思います:)

于 2013-05-03T15:43:32.850 に答える