【问题标题】:How can I assign an enum to an attribute with the information of another enum attribute?如何使用另一个枚举属性的信息将枚举分配给属性?
【发布时间】:2022-01-09 04:54:49
【问题描述】:

我有 3 个不同的枚举,其中包含定义一种元素类型的值,然后我有一个枚举,其中包含指定这 3 个枚举中的任何一个的值

类似这样的东西(这是一个例子):

public enum Vehicles {

    CAR("This is a car"),
    BIKE("This is a bike"),
    TRUCK("This is a truck");

    private String description;
    
    private Vehicles(String description) {
        this.description = description;
    }
    
    public String getDescription() {
        return description;
    }
}

其他 3 个枚举是这样的:

public enum CAR_ENUM {

    COUPE("This car is a coupe"),
    SEDAN("This car is a sedan");

    private String description;
    
    private CAR_ENUM(String description) {
        this.description = description;
    }
    
    public String getDescription() {
        return description;
    }
}

public enum BIKE_ENUM {
    
        CHOPPER("This bike is a chopper"),
        SPORTS("This bike is a sports one");
    
        private String description;
        
        private BIKE_ENUM(String description) {
            this.description = description;
        }
        
        public String getDescription() {
            return description;
        }
    }

public enum TRUCK_ENUM {
        
            SMALLTRUCK("This is a small truck"),
            BIGTRUCK("This is a big truck");
        
            private String description;
            
            private TRUCK_ENUM(String description) {
                this.description = description;
            }
            
            public String getDescription() {
                return description;
            }
        }

现在,有一个类(我们称之为 CarDealer),我需要在其中声明属性。 首先,我需要声明一个 Vehicles 项目,然后是另一个属性,它只读取 Vehicles 枚举并根据该枚举创建一个属性...

所以,在实践中,它应该是这样的:

public class CarDealer {

    private Vehicles vehicle;
    private (enum that fits whatever value the Vehicles enum has);

}

另外,我无法更改这 3 个枚举(因为它们在应用程序的其他地方使用)

我认为也许我可以使用接口或其他东西,但我没有那么实验,我完全可以使用一些想法......

希望你能给我一些帮助, 提前致谢

【问题讨论】:

  • 我很困惑,你能提供一个更真实的代码库,以便我们了解你真正想要实现的目标吗?谢谢!
  • @JoãoDias 我修改了它以给出一个适合我的情况的例子,希望它足够了
  • 如果类是CarDealer,你不能简单地使用private CAR_ENUM carType;吗?你想用这些枚举做什么,如果你能准确地解释你试图解决的用例,也许有更好的方法。
  • @JoãoDias CarDealer 是一个数据传输对象,每当我们给车辆属性一个值时,想法就是有一个属性接受该枚举的值(例如,假设车辆返回CAR_ENUM,但它也可以返回 BIKE_ENUM 或 TRUCK_ENUM,因此该属性必须准备好检索它的任何值并根据情况使其成为不同的枚举...我认为可能有一种通用的方式来声明枚举,但我有点迷路)。我只需要将数据库信息检索到这些字段中。
  • 那么我会说你需要不同的类:Car、Bike 和Truck,而不是具有所有三种可能性的枚举。但要确定我们需要更多关于您的用例的上下文,因为我认为我们在这里处理的是XY problem。

标签: java enums interface attributes assign


【解决方案1】:

我不相信使用枚举适合您的情况。但我会忽略这一点,直接回答问题。

顺便说一句,枚举应该以单数命名,因为它不是一个集合。所以,enum Vehicle,而不是Vehicles。我想知道将枚举视为集合的错误想法是否可能是您可能的设计问题的根源。但是,再次,我将把它放在一边直接回答。

理想的解决方案

请注意 EnumSet 和 EnumMap 类,它们是为枚举设计的 Set 和 Map 的高效实现。它们执行速度快,占用内存少。

在一个枚举中定义所有类型的车辆。嵌套那个枚举。将这些车辆类枚举对象的集合添加到 Vehicle 枚举类。在Vehicle的构造函数中添加第二个参数来传递车辆类枚举对象的集合。


public enum Vehicle {

    CAR( "This is a car" , EnumSet.of( Vehicle.Variety.COUPE , Vehicle.Variety.SEDAN  ) ),
    BIKE( "This is a bike" , EnumSet.of( Vehicle.Variety.CHOPPER , Vehicle.Variety.SPORTS  ) ),
    TRUCK( "This is a truck" , EnumSet.of( Vehicle.Variety.SMALLTRUCK , Vehicle.Variety.BIGTRUCK  ) );

    public enum Variety {
        COUPE , SEDAN ,         // Cars
        CHOPPER , SPORT ,       // Bikes
        SMALLTRUCK , BIGTRUCK   // Trucks
    }

    private String description;
    private Set< Vehicle.Variety > varieties ;
    
    private Vehicle ( String description , Set< Vehicle.Variety > varieties) {
        this.description = description ;
        this.varieties = varieties ;
    }
    
    public String getDescription() {
        return this.description ;
    }

    public Set< Variety > getVarieties() {
        return Set.copyOf( this.varieties ) ;  // Defensive programming, return a copy, not original.
    }

}

如果您的CarDealer (VehicleDealer?) 专门研究自行车,那么当您分配Vehicle.BIKE 对象时,您也间接地通过getVarieties() 方法提供CHOPPER 和SPORTS。

实用的解决方法

你说你已经在项目中定义了三个品种枚举,不能改变它们。

但也许你可以让它们实现一个名为Variety 的接口。该接口将为空,没有任何行为(getDescription 方法除外)。但是共享该接口类型将允许您在Vehicle 上拥有Set &lt; Variety &gt; 成员字段。

或者,鉴于您的困境对我们来说并不完全清楚,也许只是使用地图。使用EnumMap 和EnumSet 作为具体类创建Map&lt; Vehicle , Set&lt; Variety &gt;。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2021-10-21
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多