ここでの通常の答えは、これらのプロパティを持つ新しいクラスを作成し、一連の個別の引数ではなく、そのクラスのインスタンス (メッセージ エンベロープのようなもの) を渡すことです。
例えば:
public void create(MyNiftyThing thing){
object.create(thing);
}
...MyNiftyThing
クラスは次のとおりです。
class MyNiftyThing {
private String x;
private String y;
private String z;
private Calendar a;
private Calendar b;
private Calendar c;
private List<String> d;
public MyNiftyThing(String x, String y, String z, Calendar a, Calendar b, Calendar c, List<String> d) {
// ...init data members here...
}
// ...accessors for the data members here...
}
セッターではなくゲッターのみを使用することで、不変に保つことができます。純粋に便利なデータ構造である場合は、インスタンス メンバーにパブリックを使用することがありますが、適切な IDE であればアクセサーを自動生成できます (パブリックを使用した場合はfinal
、不変性のために立ち往生することになります)。
もちろん、提供できる適切なデフォルトがある場合は、コンストラクターでそれらすべてを受け入れる必要はありません(または、複数のコンストラクターを使用できます)。
おそらくこの特定のケースには当てはまりませんが、たとえば、最小限の引数 (おそらくなし) を受け入れるコンストラクターと、関連するデータ メンバーを設定してチェーンに戻るMyNiftyThing
一連のメソッドを持つことにより、独自のビルダーにすることができます。これにより、コンストラクターの署名で迷子になるのを防ぐことができます (「それは、、、または、、、...でしたか?」)。:-) その欠点は、本質的に不変性を失うことです。buildNNN
this
x
y
z
x
z
y