对键/值:用params调用方法键,返回用params构造的值

时间:2016-06-22 16:59:29

标签: java constructor enums mapping

想象一下这种伪语言的映射

class Mapping{
  key0 --> new ObjectValue()
  key1 --> new ObjectValue()
  key3 --> new ObjectValue1(String name)
  key4 --> new ObjectValue2(String name, int age)
  ...
}

在此映射中,值由不同的构造函数实例化。当我调用任何键时,我想传递一些参数。

约束: 所有键都从公共类扩展。 所有ObjectValues都从一个公共类扩展。

我希望方法调用返回

StaticMapping.key0.get();  //  return new ObjectValue()    
StaticMapping.key1.get(name);  //  return new ObjectValue1(String name)

如何做到这一点?这种模式是什么?

AFAIK数据结构地图enum constructor无法达到此目的。

2 个答案:

答案 0 :(得分:1)

因为所有键都有不同的接口,最重要的是,具有不同数量的参数,所以你必须为每个键定义一个新类型。

他们必须拥有一个共同的超类型,同时禁止使用来自java.util.function的接口作为静态类型。

class KeySuper {...}

class KeyType0 extends KeySuper {
    public ObjectValue get() {
        return new ObjectValue();
    }       
}

class KeyType1 extends KeySuper {
    public ObjectValue1 get(String str) {
        return new ObjectValue1(str);
    }       
}

// Simmilar for KeyType2

class StaticMapping {
    // public static final Supplier<ObjectValue> key0 = ObjectValue::new;
    // ^^^ does not have the common super type...

    public static final KeyType0 key0 = new KeyType0();
    public static final KeyType0 key1 = new KeyType0();
    public static final KeyType1 key2 = new KeyType1();
    public static final KeyType2 key3 = new KeyType2();
}

还有其他选项,例如,接受Object[],并在运行时检查参数的数量和类型,如果它们不正确则抛出异常,这样您就可以拥有:< / p>

abstract ObjectValue get(Object...);

在超类型上定义,这看起来并没有用。

答案 1 :(得分:0)

在我的问题中,我最初发布的是想要调用

等方法
StaticMapping.key0.get();  //  return new ObjectValue()    
StaticMapping.key1.get(name);  //  return new ObjectValue1(String name)

但结构不一定是Map。

我在代理类中找到了一个更简单的静态方法解决方案。

public class InstanceMap {
    public static ObjectValue KEY0(){
        return new ObjectValue();
    }

    public static ObjectValue1 KEY1(final String name){
        return new ObjectValue1(name);
    }

    public static ObjectValue2 KEY4(final String name, final int age){
        return new ObjectValue2(name, age);
    }
}

// method call
InstanceMap.KEY0();
InstanceMap.KEY1(name);

注意:ObjectValue2和ObjectValue1从ObjectValue

扩展

希望这也有助于其他人。