让方法采用常量参数(Java编程语言第四版练习2.17 Arnold,Gosling,Holmes)

让方法采用常量参数(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

《Java编程语言第四版》一书中有一个练习: 练习2.17:将两种
转向
方法添加到
车辆
:一种转向需要一定角度,另一种转向需要一定角度 这将使用常量
车辆。左转
车辆。右转

没有进一步的信息说明这些常量的数据类型-唯一的信息是类具有表示度(在平面上)的
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);
}