簡體   English   中英

讓方法采用常量參數(Java 編程語言第 4 版練習 2.17 Arnold、Gosling、Holmes)

[英]Having Methods Take Constant Parameters (The Java Programming Language 4th Edition Exercise 2.17 Arnold, Gosling, Holmes)

在“The Java Programming Language 4th Edition”一書中有一個練習:練習 2.17:向Vehicle中添加兩種turn方法:一種采用一定角度的轉向,另一種采用常量Vehicle.TURN_LEFTVehicle.TURN_RIGHT .

沒有進一步的信息這些常量有什么數據類型 - 唯一的信息是 class 具有int類型的屬性direction表示度數(在平面上)。

這個想法是使用重載,但如果我們有:

 public class Vehicle {
    public final static int TURN_LEFT = -90;
    public final static final int TURN_RIGHT = 90;

    ...

    public void turn(int degrees) {
        this.currentDirection = degrees;
    }

    public void turn (???) {
       ???
    }
}

采用 2 個常量的重載turn方法的定義是什么? 它們也是int類型的,那么還有什么其他的turn方法簽名是可能的(一個需要 2 個可能常量中的 1 個)?

有沒有辦法強制方法只采用特定的常量參數?

我知道可以使用enum以特殊類型定義TURN_LEFTTURN_RIGHT ,它們可以用作turn方法的(過濾的)參數,但是常量已經作為 Vehicle class 的成員給出......所以這是一些定義不好的運動還是這里有其他技巧?

問題是enum是否被處理過。 在這種情況下,枚舉是理想的:

public enum Turn {
    TURN_LEFT(-90),
    TURN_RIGHT(90);

    public final int degrees;

    Turn(int degrees) {
        this.degrees = degrees;
    }
}

public static final Turn TURN_LEFT = Turn.TURN_LEFT;
public static final Turn TURN_RIGHT = Turn.TURN_RIGHT;

public void turn(Turn direction) {
    turn(direction.degrees);
}

我將枚舉常量復制為最終字段,以便擁有 Vehicle.TURN_LEFT。


沒有枚舉:

public static final Object TURN_LEFT = new Object();
public static final Object TURN_RIGHT = new Object();

public void turn(Object direction) {
    turn(direction == Vehicle.TURN_LEFT ? -90 : 90);
}

但這不是類型安全的,它需要一個本地類/接口。

因為僅有的兩種可能性是 LEFT 或 RIGHT,所以我會將它們中的每一種與 boolean 相關聯,例如 LEFT -> true,RIGHT -> false,我將傳遞參數 boolean。 喜歡:

public void turn ( boolean leftOrRight ) { // do the checking on the value passed as a boolean
 }

正如您所提到的,在 Java 中處理此類常量的經典方法確實是使用枚舉。 然后,您使用 integer 和枚舉類型參數重載您的方法turn() 優點是您的實際 class 和不同的(可能即將到來的)方向分開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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