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

Java 配对键/值:使用params调用方法键,返回使用params构造的值,java,constructor,enums,mapping,Java,Constructor,Enums,Mapping,想象一下这种伪语言中的映射 class Mapping{ key0 --> new ObjectValue() key1 --> new ObjectValue() key3 --> new ObjectValue1(String name) key4 --> new ObjectValue2(String name, int age) ... } 在此映射中,值由不同的构造函数实例化。当我调用任何键时,我想传递一些参数 约束:所有键都从一个公共类扩

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

class Mapping{
  key0 --> new ObjectValue()
  key1 --> new ObjectValue()
  key3 --> new ObjectValue1(String name)
  key4 --> new ObjectValue2(String name, int age)
  ...
}
在此映射中,值由不同的构造函数实例化。当我调用任何键时,我想传递一些参数

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


我希望方法调用返回

StaticMapping.key0.get();  //  return new ObjectValue()    
StaticMapping.key1.get(name);  //  return new ObjectValue1(String name)
如何做到这一点?这种模式是什么?



如果数据结构映射不能实现这一点。

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

它们必须有一个通用的超类型,这一事实也禁止将
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();
}

在超级类型上定义,这似乎没有什么用处。

在我的问题中,我最初发布了我想调用的方法,如

StaticMapping.key0.get();  //  return new ObjectValue()    
StaticMapping.key1.get(name);  //  return new ObjectValue1(String name)
但结构不一定是地图

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

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扩展而来的


希望这也能帮助其他人。

谢谢你的回答,我不是瓦拉格的粉丝。在StaticMapping类中,如何传递参数?@RaymondChenon您可以在调用
get
时传递参数。很好,但这并不能满足“所有键都从公共类扩展”的约束。这会容易得多:PNo,我想到了这些限制。说得好,我会在作品中重新编辑。没错,答案就在眼前。
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);