いくつかの「デフォルト引数」が必要なようです。Python では、次のようなことができます。
class MyClass:
def __init__(done=false, load=1, ...):
self.done = done
self.load = load
# ...
a_new_instance = MyClass(done=true)
基本的に、すべての変数はデフォルト値から始まりますが、必要に応じて変更できます。
Java では、少し異なります。
class MyClass {
private boolean done = false; // Notice the default value for done will be false
// ... you would list (and instantiate!) the rest of your variables
public MyClass() {}
public MyClass(boolean done, int lvl, ...) {
this.done = done;
// ...
}
}
このように、デフォルト値を変更したい場合にのみコンストラクターを呼び出す必要があります。しかし、1 つまたは 2 つの値だけを変更したい場合はどうなるでしょうか。さて、新しいコンストラクタを作成できます。
public MyClass(boolean done) { this.done = done; }
public MyClass(boolean done, int lvl) { this.done = done; this.lvl = lvl; }
しかし、これはすぐに手に負えなくなります!
したがって、これを回避するには、「ビルダー」パターンを使用できます。それは次のようになります。
public class MyClass {
private boolean done;
private int lvl;
// Now the constructor is private and takes a builder.
private MyClass(MyClassBuilder builder) {
// ... and your variables come from the ones you will build.
this.done = builder.done;
this.lvl = builder.lvl;
// ...
}
public static class MyClassBuilder {
// The builder also has the same members.
private boolean done;
private int lvl;
// Notice that we return the builder, this allows us to chain calls.
public MyClassBuilder done(boolean isDone) {
this.done = isDone;
return this;
}
public MyClassBuilder level(int level) {
this.lvl = level;
}
// And a method to build the object.
public MyClass build() {
MyClass mc = new MyClass();
mc.done = this.done;
mc.lvl = this.lvl;
// ... copy over all your variables from the builder to the new class
return mc;
}
}
}
したがって、MyClass
オブジェクトをインスタンス化したい場合は、次のようにできます。
MyClass mc = MyClassBuilder.done(false);
または、呼び出しをチェーンできます。
MyClass mc2 = MyClassBuilder.done(true).level(4). // ... you can go on for a while
余談ですが、クラスに 3 つまたは 4 つを超える変数がある場合は、そのクラスがやりすぎていることを示しています。クラスに複数の「責任」がある場合は、それをいくつかの小さなクラスに分割する必要があります。そうすれば、ビルダー クラスは必要ありません。