Вопрос

Есть ли какой-либо сокращенный способ определения и использования общих определений без необходимости постоянно повторять конкретное общее описание, так что, если есть изменения, мне не нужно менять все определения / обычаи, хотя, например, в кодовой базе возможно что-то подобное:

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>();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top