使用枚举将对象属性映射到另一个对象属性?

时间:2016-04-12 14:32:50

标签: java enums

只是想知道是否有人可以帮我解决问题。

基本上我有来自不同地方的两个对象,例如两个不同的汽车类。我想使用我创建的映射器将类carA的属性映射到类carB的属性。这在大多数情况下都很简单,如下所示。

public carB carMapper(carA car){

    carB carb = new carB();

    carb.weight = car.weight
    carb.size = car.size


}

然而,在某些情况下,CarA类存储的相应值的格式与CarB的格式略有不同,即,对于汽车模型,福特汽车将其存储为Frd,但carB将其存储为福特。是否有一种简单的方法(可能使用枚举或其他东西),我可以正确地映射这些?我知道我能做到

 if (carA.model = frd)
   then carB.model = Ford 

等但我不想为每种情况都这样做....我知道carA和carB的可能值,我能以某种方式使用枚举来帮助我吗?

感谢。

2 个答案:

答案 0 :(得分:1)

您似乎正在寻找类似映射构造函数的内容。已经存在一个名为copy constructor的众所周知的概念,它可以帮助您创建给定类的对象的副本。在您的情况下,您希望在给定另一个类的实例的情况下创建某个类的实例。

我不认为enums可以(或应该)用于此目的,主要是因为它们不是为此目的而设计的。

目前还不是很清楚这种结构是否非常有用(和通用)。例如,您是否要创建Turtle给定Car?它们之间没有太多共同点,因此提供这样的设施似乎没什么价值。您将CarACarB作为的示例,但由于它们是两个不同的类,因此它们将被假定为完全不同的东西,任何共性都应该纯粹假设巧合。

如果您确实希望外部化此操作,那么您可以考虑使用某种序列化以JSON或XML格式进行映射,然后可以想象创建该格式的通用处理涉及的课程对象:

<map from="CarA" to="CarB">
  <property>model</property>
  <override>Ford</override>
</map>

在这种情况下,您创建一个CarB实例,并根据映射反射设置其中的字段。您可以假设所有其他字段都是逐字复制的。当然,您需要清除规范的所有细节,以使其普遍有用。

否则,我认为您提到的if-else构造没有任何问题,因为它的用处非常有限。

答案 1 :(得分:0)

感谢您的反馈,感谢您的回复,抱歉我没有机会尽快回复。我使用枚举找到了解决问题的方法。它完全适合我所寻找的东西,可能由于某种原因它不是理想的但如果有人能想到某些原因我不应该以这种方式使用枚举,我很高兴听到它。无论如何,我的解决方案在下面,允许我添加多个值等:

public enum ModelMapper
{
Ford("Ford", "frd"),
Renault("Renault", "rnlt");

private final String carAValue;
private final String carBValue;

ModelMapper(String carA_value, String carB_value) 
{
    carAValue = carA_value; 
    carBValue = carB_value;       
}

public static String getCarAValue(String carB_value)
{
    for (ModelMapper m: ModelMapper.values()) {
        if (m.carBValue.equals(carB_value)) {
            return m.carAValue;
        }  
    }
    throw new IllegalArgumentException(carB_value);
}
}