簡體   English   中英

更好地更改父母的領域或覆蓋吸氣劑?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM