让方法采用常量参数(Java编程语言第四版练习2.17 Arnold,Gosling,Holmes)
《Java编程语言第四版》一书中有一个练习: 练习2.17:将两种让方法采用常量参数(Java编程语言第四版练习2.17 Arnold,Gosling,Holmes),java,overloading,Java,Overloading,《Java编程语言第四版》一书中有一个练习: 练习2.17:将两种转向方法添加到车辆:一种转向需要一定角度,另一种转向需要一定角度 这将使用常量车辆。左转或车辆。右转 没有进一步的信息说明这些常量的数据类型-唯一的信息是类具有表示度(在平面上)的int类型的属性direction 想法是使用重载,但如果我们有: public class Vehicle { public final static int TURN_LEFT = -90; public final static
转向
方法添加到车辆
:一种转向需要一定角度,另一种转向需要一定角度
这将使用常量车辆。左转或车辆。右转
没有进一步的信息说明这些常量的数据类型-唯一的信息是类具有表示度(在平面上)的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 (???) {
???
}
}
采用这两个常量的重载turn
方法的定义是什么?它们也是int
类型,那么还有什么turn
方法签名是可能的(取2个可能常数中的1个)
有没有办法强迫一个方法只接受特定的常量参数
我知道可以使用enum
在特殊类型中定义TURN_LEFT
和TURN_RIGHT
,这可以用作TURN
方法的(过滤)参数,但常量已作为车辆类的成员给出。。。那么,这是一个定义错误的练习还是有其他技巧 因为只有两种可能性是左或右,所以我会将它们中的每一种都与布尔值关联,例如LEFT->true,RIGHT->false,并将参数传递为布尔值。比如:
public void turn ( boolean leftOrRight ) { // do the checking on the value passed as a boolean
}
正如您所提到的,Java中处理此类常量的经典方法确实是使用枚举。然后使用整数和枚举类型参数重载方法turn()
。这样做的好处是将你的实际职业和不同的(可能即将到来的)方向分开 问题是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);
}
我复制了枚举常量作为最终字段,以便有一辆车。左转
不带枚举:
但这不是类型安全的,需要一个本地类/接口。是的,通常有很多可能的方法。但问题是关于这个特定的练习-使用重载,将常量作为参数。。。还有什么turn
方法签名是可能的?没有enum
s到目前为止没有被处理过(它们在本书的后面),最重要的是-turn\u LEFT
和turn\u RIGHT
是类Vehicle
的成员-它们被赋予Vehicle.turn\u LEFT等等。。。只有它们的类型没有给出-但是假设int
I think.OK:)我投了赞成票,因为“我将枚举常量复制为fina…”,所以所有条件都满足了。但这意味着这项练习并不那么好。(如果没有其他技巧的话)一个人可以制作两个字符串
或布尔值
常量,所以turn可能会过载。或者非常脏的一个double
。我将添加一些代码。我也这么认为,但它再次指出了一个糟糕的练习公式。。。
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);
}