![](/img/trans.png)
[英]Getting parent class field value instead of child field which supposed to override parent's
[英]Better to change parent's field or override getter?
假設我有一個Projectile
類,它充當游戲中所有彈丸的基類。 它包含最大速度,重力系數,反彈系數等的默認值。
public abstract class Projectile {
protected float maxSpeed = 100.0f;
protected float gravityCoefficient = 1.0f;
protected float bounceCoefficient = 1.0f;
...
}
然后,我有一堆子類,每個子類都可以選擇重寫某些默認值。
哪種方法更好?
1.在子構造函數中設置字段值
public class Arrow {
public Arrow(){
super();
maxSpeed = 200.0f;
}
}
2.讓孩子覆蓋吸氣劑
public class Arrow {
public float getMaxSpeed(){
return 200.0f;
}
}
我傾向於說第一種方法更好,因為這意味着可以直接訪問該字段,而無需任何額外的函數調用。 但是,這確實意味着該值在對象創建期間設置了兩次,一次由父級設置,一次由子級設置。
我在這里想念什么嗎? 也許還有另一種方法?
直觀地講,任何特定彈丸的最大速度在其生命周期內都不太可能發生變化(即使在相同類型的不同實例可以具有不同的最大速度的情況下),因此,我希望最終使用它。 我也希望將其定型-除了真正的常量之外,我很少使用非私有字段。
當您具有Projectile
某些狀態(字段)時,我將避免讓getMaxSpeed
揭示出與字段不同而導致的最大速度的混淆。
我可能會這樣設計:
public abstract class Projectile {
private final float maxSpeed;
protected Projectile(float maxSpeed) {
this.maxSpeed = maxSpeed;
}
// Only if you really need this...
protected Projectile() {
this(200f);
}
public final getMaxSpeed() {
return maxSpeed;
}
}
public class Arrow extends Projectile {
public Arrow() {
super(100f);
}
}
可以用類似的方式來處理引力系數和彈跳系數-或如果所有這些真的都充當“對於特定類型的每個實例相同的值”,則可以引入一個新類來表示這些常數,從而將變化的狀態分開從常量限制/系數中提取類型的實例-每個實例可能只是對該新類的實例的最終引用。 不幸的是,Java(以及至少一些類似的語言)並不能很好地模擬這種層次結構。 總是很煩人:(
您應該有一個二傳手並使用它,這就是二傳手的用途。 它將允許您將字段保持私有狀態。 另一個好處是,使用Java Bean約定將允許您使用諸如Apache Commons BeanUtils之類的庫來填充和操作對象。 您還可以將數據持久保存在數據庫或文件中。
public abstract class Projectile {
private float maxSpeed = 100.0f; // default
protected void setMaxSpeed(float newSpeed) {
maxSpeed = newSpeed;
}
}
public class Arrow extends Projectile {
public Arrow() {
super();
setMaxSpeed(200.0f); // arrow specific values
}
}
第一種方法。 在抽象基類中聲明一個名為ModifyDefaults()的方法。 在每個類中實現它並在構造函數中調用,以便每當有人看到抽象類時,都可以得出結論,您將修改子級中的默認值。
或者,如果只有幾個決定性參數,則只需將Projectile創建的職責移交給projectileFactory。
您傾向於第一個答案。 它確實明確指出以下內容:
子類負責創建自己的實例變量(屬性)
盡管在某些觀點上聽起來不錯,但重寫吸氣劑通常不能提供良好的可維護性。 構造函數很清楚地聲明了額外的一組屬性默認值。
我不確定您的設計,但是如果您擁有的超類沒有自己的狀態,請嘗試使其abstract
,並且設計會比我們在那種情況下所討論的完全更改(那時候可以考慮選項2) 。
對於Java,編譯器優化和JIT優化對於提高性能非常重要。
第二段代碼將更容易優化,無需擔心額外的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.