【问题标题】:Pair key/value : call a method key with params , returns value constructed with paramsPair key/value :使用 params 调用方法 key,返回使用 params 构造的值
【发布时间】:2016-06-22 16:59:28
【问题描述】:

用这种伪语言想象这个映射

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 数据结构 Mapenum constructor 无法实现这一点。

【问题讨论】:

    标签: java constructor enums mapping


    【解决方案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[],并在运行时检查参数的数量和类型,如果不正确则抛出异常,这样您就可以:

    abstract ObjectValue get(Object...);
    

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

    【讨论】:

    • 感谢您的回答,我不是 varargs 的粉丝。在您的 StaticMapping 类中,您如何传递参数?
    • @RaymondChenon 你会在调用get时传递参数。
    【解决方案2】:

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

    之类的方法
    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 扩展

    希望这对其他人也有帮助。

    【讨论】:

    • 很好,但这并不能满足“所有键都从一个公共类扩展”你的约束。那会容易得多:P
    • 不,我想到了那些限制。好点,我将在 OP 中重新编辑。没错,答案就在眼前。
    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 2011-12-14
    • 2015-11-22
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2017-02-01
    相关资源
    最近更新 更多