[英]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_LEFT
或Vehicle.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_LEFT
和TURN_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.