java - 让方法采用常量参数(Java 编程语言第 4 版练习 2.17 Arnold、Gosling、Holmes)
问题描述
《Java 编程语言第 4 版》一书中有一个练习:练习 2.17:将两种turn
方法添加到Vehicle
: 一种需要旋转的度数,另一种需要使用常量Vehicle.TURN_LEFT
或Vehicle.TURN_RIGHT
.
没有进一步的信息这些常量具有什么数据类型 - 唯一的信息是该类具有表示度数direction
的类型属性int
(在平面上)。
这个想法是使用重载,但如果我们有:
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 (???) {
???
}
}
turn
采用 2 个常量的重载方法的定义是什么?它们也是类型int
,那么其他turn
方法签名可能是什么(一个需要 2 个可能常量中的 1 个)?
有没有办法强制方法只采用特定的常量参数?
我知道可以使用 anenum
来定义一个特殊类型TURN_LEFT
,TURN_RIGHT
它可以用作方法的(过滤的)参数turn
,但是常量已经作为 Vehicle 类的成员给出......所以这是一些错误定义的练习还是这里还有其他技巧吗?
解决方案
问题是enum
s 是否得到了治疗。在这种情况下,枚举是理想的:
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);
}
但这不是类型安全的,它需要一个本地类/接口。