【问题标题】:How to implement a Java Hashmap with different objects as values如何使用不同的对象作为值来实现 Java Hashmap
【发布时间】:2019-04-18 14:18:21
【问题描述】:

我想通过 Jackson 解析 YAML 文件,但遇到的问题是其中一个属性(我们称之为“事件”)有一个名为“类型”的字符串和一个“属性”对象,该对象因不同的事件而不同。我的问题是我需要为此 YAML 定义 POJO。因此,我想定义一个带有 VariableObject 的 Hashmap,它可以是任何一些预定义的类(为简洁起见,假设为 Shipping 和 Inventory)。

如何实现这样的 Hashmap?

public class Event {
    private static String type;
    private static Map<String, VariableObject> properties;

    public static void main(String[] args) {
        Inventory inventory = new Inventory("inventoryName", 13);
        properties.put("Inventory", inventory);
        Shipping shipping = new Shipping("shippingName", true);
        properties.put("Shipping", shipping);
    }
}


public class Inventory {

    private static String name;
    private static int someNumber;

    public Inventory(String name, int someNumber) {
        this.name = name;
        this.someNumber = someNumber;
    }
}


public class Shipping {

    private static String name;
    private static boolean someBoolean;

    public Shipping(String name, boolean someBoolean) {
        this.name = name;
        this.someBoolean = someBoolean;
    }
}

【问题讨论】:

  • 您应该使用公共接口或超类,即Inventory implements VariableObjectInventory extends VariableObject(因为两者都有可能是公共超类VariableObject 的一部分的name 属性,因此应该是Inventory extends VariableObject)。

标签: java dictionary oop generics jvm


【解决方案1】:

你说的很简单Object。它是最具体的常见超类:

private static Map<String, Object> properties;

其他解决方案是让InventoryShipping 实现一些通用接口,例如Named,并将其用作HashMap 中的类型参数。

【讨论】:

    【解决方案2】:

    做到这一点的一种方法是使ShippingInventory 实现相同的接口(如您的cas 中的VariableObject

    public class Event {
        private static String type;
        private static Map<String, VariableObject> properties;
    
        public static void main(String[] args) {
            Inventory inventory = new Inventory("inventoryName", 13);
            properties.put("Inventory", inventory);
            Shipping shipping = new Shipping("shippingName", true);
            properties.put("Shipping", shipping);
        }
    }
    
    public interface VariableObject{
    //you can define common methods here if you want
    }
    
    
    public class Inventory implements VariableObject{
    
        private static String name;
        private static int someNumber;
    
        public Inventory(String name, int someNumber) {
            this.name = name;
            this.someNumber = someNumber;
        }
    }
    
    
    public class Shipping implements VariableObject{
    
        private static String name;
        private static boolean someBoolean;
    
        public Shipping(String name, boolean someBoolean) {
            this.name = name;
            this.someBoolean = someBoolean;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 2014-04-11
      相关资源
      最近更新 更多