为java中的一个枚举项定义子类型

时间:2017-04-05 10:52:16

标签: java enums

我有一个枚举,其中包含街道中这三种类型的区域:

public enum EArea
{
    VEHICLE_WAY,
    SIDEWALK,
    FORBIDDEN
}

我想为VEHICLE_WAY定义两个子类型。例如DIRECT_LANETURNLEFT_LANE

我想也许我可以使用this并定义子类型,但只有VEHICLE_WAY有子类型。有没有更好的想法在java中这样做?

3 个答案:

答案 0 :(得分:1)

我建议不要这样使用枚举。更好的方法是从枚举值创建类,并将VEHICLE_WAY类扩展为所需的子类型。枚举值FORBIDDEN听起来更像是属性。

public class VehicleWay {
   ...
}

public class DirectLane extends VehicleWay {
   ...
}

public class TurnLeftLane extends VehicleWay {
   ...
}

public class SideWalk {
   ...
}

答案 1 :(得分:0)

您可以定义一个接口EArea并让多个枚举实现它。

答案 2 :(得分:0)

您可以将以下类与嵌套子类型枚举一起使用,但是子类型有些隐藏,您可以继续使用单个枚举;

enum EArea {
    VEHICLE_WAY, SIDEWALK, FORBIDDEN;

    Lane lane;

    public Lane getLane() {
        return lane;
    }

    public EArea setLane(Lane lane) {
        this.lane = lane;
        return this;
    }

    enum Lane {
        DIRECT_LANE, TURNLEFT_LANE
    }
}

然后你可以使用像<; p>这样的子类型

EArea.VEHICLE_WAY.setLane(EArea.Lane.DIRECT_LANE);     // returns a direct lane vehicle way
EArea.VEHICLE_WAY.setLane(EArea.Lane.TURNLEFT_LANE);   // returns a turnleft lane vehicle way

虽然这允许将通道添加到其他枚举,但如果您愿意,可以在getter / setter中进行验证。