首页 > 解决方案 > 让方法采用常量参数(Java 编程语言第 4 版练习 2.17 Arnold、Gosling、Holmes)

问题描述

《Java 编程语言第 4 版》一书中有一个练习:练习 2.17:将两种turn方法添加到Vehicle: 一种需要旋转的度数,另一种需要使用常量Vehicle.TURN_LEFTVehicle.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_LEFTTURN_RIGHT它可以用作方法的(过滤的)参数turn,但是常量已经作为 Vehicle 类的成员给出......所以这是一些错误定义的练习还是这里还有其他技巧吗?

标签: javaoverloading

解决方案


问题是enums 是否得到了治疗。在这种情况下,枚举是理想的:

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);
}

但这不是类型安全的,它需要一个本地类/接口。


推荐阅读