Вопрос
Есть ли какой-либо сокращенный способ определения и использования общих определений без необходимости постоянно повторять конкретное общее описание, так что, если есть изменения, мне не нужно менять все определения / обычаи, хотя, например, в кодовой базе возможно что-то подобное:
Typedef myGenDef = < Object1, Object2 >;
HashMap< myGenDef > hm = new HashMap< myGenDef >();
for (Entry< myGenDef > ent : hm..entrySet())
{
.
.
.
}
Решение
Существует псевдо-typedef antipattern . ..
class StringList extends ArrayList<String> { }
Хорошие вещи, выпей! ; -) р>
Как отмечается в статье, у этого метода есть некоторые серьезные проблемы, в первую очередь это "typedef" на самом деле является отдельным классом и поэтому не может использоваться взаимозаменяемо ни с типом, который он расширяет, ни с другими аналогично определенными типами.
Другие советы
В универсальном методе вы можете использовать ограниченную форму вывода типа, чтобы избежать некоторых повторений.
Пример: если у вас есть функция
<K, V> Map<K, V> getSomething() {
//...
}
вы можете использовать:
final Map<String, Object> something = getsomething();
вместо:
final Map<String, Object> something = this.<String, Object>getsomething();
Используйте шаблон фабрики для создания универсальных шаблонов:
Пример метода:
public Map<String, Integer> createGenMap(){
return new HashMap<String,Integer>();
}
Антипаттерн pseudo-typedef, упомянутый Shog9, будет работать - хотя не рекомендуется использовать ANTIPATTERN - но он не отвечает вашим намерениям. Цель псевдо-typedef - уменьшить беспорядок в объявлении и улучшить читаемость. Р>
То, что вы хотите - это иметь возможность заменить группу объявлений дженериков одной сделкой. Я думаю, что вы должны остановиться и подумать: «Ведьмы это ценно?». Я имею в виду, я не могу придумать сценарий, где тебе это понадобится. Представьте себе класс А:
class A {
private Map<String, Integer> values = new HashMap<String, Integer>();
}
Теперь представьте, что я хочу изменить поле «значения» на карту. Почему существует много других полей, разбросанных по коду, который нуждается в таком же изменении? Что касается операций, использующих «значения», то простого рефакторинга будет достаточно.
Нет.Хотя groovy, язык JVM, динамически типизируется и позволит вам писать:
def map = new HashMap<complicated generic expression>();