В одном из моих проектов Java меня преследует повторение кода из-за того, как Java обрабатывает (not) примитивы. После того, как вы снова вручную скопировали одно и то же изменение в четыре разных местоположения (int
, long
, float
, double
), в третий раз, снова и снова, я действительно очень близко (?) К привязке.
В разных формах эта проблема была поднята сейчас и затем в StackOverflow:
- Управление очень повторяющимся кодом и документацией в Java
- Как избежать повторения при работе с примитивными типами?
- Передача динамического списка примитивов методу Java
Консенсус, казалось, сходился к двум возможным альтернативам:
- Используйте генератор кода.
- Что вы можете сделать? C'est la vie!
Хорошо, второе решение - это то, что я делаю сейчас, и это медленно становится опасным для моего здравомыслия, подобно хорошо известный метод пыток.
Прошло два года с тех пор, как были заданы эти вопросы, и появился Java 7. Поэтому я надеюсь на более легкое и/или более стандартное решение.
-
Есть ли в Java 7 какие-либо изменения, которые могут облегчить нагрузку в таких случаях? Я не мог найти ничего в сокращенных сводках изменений, но, возможно, есть какая-то неясная новая функция где-то?
-
Хотя генерация исходного кода является альтернативой, я бы предпочел решение, поддерживаемое с помощью стандартного набора функций JDK. Конечно, используя
cpp
или другой генератор кода будет работать, но он добавляет больше зависимостей и требует изменений в системе сборки.Единственная система генерации кода, которая, по-видимому, поддерживается JDK, - это механизм аннотаций. Я предвижу процессор, который расширяет исходный код следующим образом:
@Primitives({ "int", "long", "float", "double" }) @PrimitiveVariable int max(@PrimitiveVariable int a, @PrimitiveVariable int b) { return (a > b)?a:b; }
Идеальный выходной файл будет содержать четыре запрошенных варианта этого метода, предпочтительно с соответствующими комментариями Javadoc e.t.c. Есть ли где-нибудь обработчик аннотации для обработки этого случая? Если нет, что нужно, чтобы построить один?
-
Возможно, какой-то другой трюк, который появился недавно?
EDIT:
Важное замечание: я бы не использовал примитивные типы, если у меня не было причины. Даже сейчас в некоторых приложениях наблюдается очень высокая производительность и память при использовании типов в штучной упаковке.
ИЗМЕНИТЬ 2:
Использование max()
в качестве примера позволяет использовать метод compareTo()
, который доступен во всех числовых коробчатых типах. Это немного сложнее:
int sum(int a, int b) {
return a + b;
}
Как можно поддерживать этот метод для всех числовых типов в штучной упаковке без фактического написания его шесть или семь раз?