前述のように、これはクラスがやりすぎている兆候である可能性がありますが、この問題には一般的に使用される「解決策」があります。
ビルダー パターンはこのような状況でよく使用されますが、異なる引数を持つ多くのコンストラクターがある場合にも非常に役立ちます。ビルダーは、特にブール リテラルが使用されている場合に、引数の意味をより明確にするため優れています。
これがビルダーパターンです。これが機能する方法は次のとおりです。
AreodynamicCalculator calc = AreodynamicCalculator.builder()
.config(theAircraftConfiguration)
.addAileron(aileronOne)
.addAileron(aileronTwo)
.addElevator(elevatorOne)
.addElevator(elevatorTwo)
.addRudder(rudderOne)
.addRudder(rudderTwo)
.build()
内部的に、ビルダーはこれらすべてのフィールドを格納し、build()
が呼び出されると、これらのフィールドを受け取る (現在はプライベートな) コンストラクターを呼び出します。
class AreodynamicCalculator {
public static class Builder {
AircraftConfiguration config;
Aileron aileronOne;
Aileron aileronTwo;
Elevator elevatorOne;
Elevator elevatorTwo;
...
public Builder config(AircraftConfiguration config) {
this.config = config;
return this;
}
public Builder addAileron(Aileron aileron) {
if (this.aileronOne == null) {
this.aileronOne = aileron;
} else {
this.aileronTwo = aileron;
}
return this;
}
// adders / setters for other fields.
public AreodynamicCalculator build() {
return new AreodynamicCalculator(config, aileronOne, aileronTwo ... );
}
}
// this is the AircraftConfiguration constructor, it's now private because
// the way to create AircraftConfiguration objects is via the builder
//
private AircraftConfiguration config, AileronOne aOne, AileronTwo aTwo, ElevatorOne eOne, ElevatorTwo eTwo, Rudder r, Rudder rr, RateGyros rG) {
/// assign fields
}
}