我應該包括在動物中發現的所有屬性...
那些不是不變的狗,是的(這種或那種方式;見下文)。但是,例如,如果Animal
有latinFamily
,那麼你不需要Dog
來擁有它,因爲那總是"Canidae"
。例如:
public Animal(String latinFamily){
this.latinFamily = latinFamily;
}
public Dog(String breed){
super("Canidae");
this.breed = breed;
}
如果你正在尋找的參數的個數,以構造是unweildy,你可以考慮建造模式:
public class Dog {
public Dog(String a, String b, String c) {
super("Canidae");
// ...
}
public static class Builder {
private String a;
private String b;
private String c;
public Builder() {
this.a = null;
this.b = null;
this.c = null;
}
public Builder withA(String a) {
this.a = a;
return this;
}
public Builder withB(String b) {
this.b = b;
return this;
}
public Builder withC(String c) {
this.c = c;
return this;
}
public Dog build() {
if (this.a == null || this.b == null || this.c == null) {
throw new InvalidStateException();
}
return new Dog(this.a, this.b, this.c);
}
}
}
用法:
Dog dog = Dog.Builder()
.withA("value for a")
.withB("value for b")
.withC("value for c")
.build();
這使得更容易清楚哪些參數是哪一個參數,這與參數構造函數的長串參數相反。您可以獲得清晰的好處(您知道withA
指定了「a」信息,withB
指定了「b」等),但沒有半實踐的危險(因爲部分構建的實例是不好的實踐) ;存儲信息,然後build
做構建Dog
的工作。
是的,這是繼續下去的方法。如果需要,可以將參數封裝在映射中或包裝類中以提高可讀性。 – 2015-03-03 09:54:08
你是對的,包括在Animal中找到的所有屬性,以及你在Dog類中需要的所有額外屬性。只需在參數中用數據類型更正你的代碼即可。像'公狗(字符串拉丁名,DataTypeOfBreed品種)' – 2015-03-03 09:55:40