2016-06-22 2 views
1

Представьте, это отображение в этом псевдо языкепара ключ/значение: вызвать ключ метода с Params, возвращает значение построено с Params

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 не может достичь этого.

ответ

0

На мой вопрос, я изначально отвечал я хочу назвать такие методы, как

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

Надеется, что это помогает другим, а также.

+0

Приятно, но это не заполняет _your_ ограничение _ «Все ключи распространяются от общего класса» _. Это было бы намного проще: P –

+1

Нет, я думал об этих ограничениях. Хороший момент, я буду редактировать в OP. Правда, ответ был бы прямо перед глазами. –

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...); 

определено на супер-типе, что на самом деле не кажется полезным.

+0

Спасибо за ваш ответ, я не поклонник varargs. В вашем классе StaticMapping, как вы можете передать аргумент? –

+0

@RaymondChenon Вы должны передать аргументы при вызове '' 'get'''. –