Самый эффективный способ достижения безопасности типов примитивных типов в Java? - PullRequest
7 голосов
/ 30 октября 2019

Допустим, я хотел бы обеспечить безопасность типов в Java для примитивных типов. В качестве примера, давайте хотим отличить Ratio от AbsoluteValue, оба представлены double.

Насколько я знаю, Java не поддерживает синонимы типа .

Так что я вполне уверен, что будут задействованы некоторые накладные расходы.

В верхней части моей головы я мог подумать о том, чтобы определить новые calsses, которые обертывают double (многошаблонного), или подклассы Double ... или, может быть, есть даже другие варианты?

Какой подход дает мне наименьшую нагрузку на производительность?

РЕДАКТИРОВАТЬ: Я ограничен Java 8так что это неявная основа вопроса;однако, если есть альтернативные решения в более новых версиях языка, я все равно хотел бы услышать о них.

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Взгляните на структуру Коллектор (как у Lombok, но больше заботятся о типах, чем о сокращении шаблонов). @Extension методы или @Structural интерфейсы предоставляют различные способы реализации "типизации", которая удовлетворяет некоторым требованиям. Это не будет работать напрямую с примитивными полями. Очень простой класс-обертка может быть оптимизирован JIT в различных случаях (и он сможет использовать модификатор inline Project Valhalla , когда это произойдет).

(я подозреваю, что эторазумный запрос функции для реализации псевдонимов первого класса в дополнение к существующему набору возможностей Manifold.)

2 голосов
/ 30 октября 2019

Самый производительный способ, которым я могу придумать, это написать свои собственные классы-обертки, которые имеют некоторую аннотацию маркера:

@PrimitiveTypeAlias(double.class)
public class Milliseconds
{
    double value() { ... } 
}

Затем подключиться к процессору аннотаций во время компиляциии физически замените классы-обертки их примитивными аналогами (используя что-то вроде Lombok).

... Но я подозреваю, что вы, возможно, подразумеваете «наиболее производительный и также не требующий больших усилий»:)

...