Pair key/value : 用params调用一个方法key,returns用params构造的value
Pair key/value : call a method key with params , returns value constructed with params
用这种伪语言想象一下这个映射
class Mapping{
key0 --> new ObjectValue()
key1 --> new ObjectValue()
key3 --> new ObjectValue1(String name)
key4 --> new ObjectValue2(String name, int age)
...
}
在此映射中,值由不同的构造函数实例化。当我调用任何键时,我想传递一些参数。
约束: 所有键都从公共 class. 扩展而来
所有 ObjectValues 都从一个公共的 class.
扩展而来
我希望方法调用 return
StaticMapping.key0.get(); // return new ObjectValue()
StaticMapping.key1.get(name); // return new ObjectValue1(String name)
如何实现?这是什么模式?
AFAIK 数据结构 Map , enum constructor 无法实现此目的。
因为所有键都有不同的接口,最重要的是,具有不同数量的参数,您必须为每个键定义一个新类型。
它们必须具有共同的超类型这一事实也禁止使用来自 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[]
,并在运行时检查参数的数量和类型,如果参数不正确则抛出异常,这样您就可以:
abstract ObjectValue get(Object...);
在超类型上定义,这似乎没什么用。
在我的问题中,我最初发布了我想调用方法,例如
StaticMapping.key0.get(); // return new ObjectValue()
StaticMapping.key1.get(name); // return new ObjectValue1(String name)
但结构不必是 Map。
我在代理中找到了一个使用静态方法的更简单的解决方案 class。
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
希望这对其他人也有帮助。
用这种伪语言想象一下这个映射
class Mapping{
key0 --> new ObjectValue()
key1 --> new ObjectValue()
key3 --> new ObjectValue1(String name)
key4 --> new ObjectValue2(String name, int age)
...
}
在此映射中,值由不同的构造函数实例化。当我调用任何键时,我想传递一些参数。
约束: 所有键都从公共 class. 扩展而来
所有 ObjectValues 都从一个公共的 class.
我希望方法调用 return
StaticMapping.key0.get(); // return new ObjectValue()
StaticMapping.key1.get(name); // return new ObjectValue1(String name)
如何实现?这是什么模式?
AFAIK 数据结构 Map , enum constructor 无法实现此目的。
因为所有键都有不同的接口,最重要的是,具有不同数量的参数,您必须为每个键定义一个新类型。
它们必须具有共同的超类型这一事实也禁止使用来自 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[]
,并在运行时检查参数的数量和类型,如果参数不正确则抛出异常,这样您就可以:
abstract ObjectValue get(Object...);
在超类型上定义,这似乎没什么用。
在我的问题中,我最初发布了我想调用方法,例如
StaticMapping.key0.get(); // return new ObjectValue()
StaticMapping.key1.get(name); // return new ObjectValue1(String name)
但结构不必是 Map。
我在代理中找到了一个使用静态方法的更简单的解决方案 class。
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
希望这对其他人也有帮助。