Более строгий контроль примитивных типов
От: halo Украина  
Дата: 24.07.18 18:33
Оценка:
Иногда при работе с примитивными типами хочется наделить их некоторой семантикой, не прибегая к написанию обёрток ввиду их дороговизны по отношению к использованию хипа. Например, тип int семантически с точки зрения кода может быть и RGB(A)-цветом, и некоторым индексом, и просто значением, но мне не хотелось бы заводить отдельный public final class Color. Так же, например, и с double: это может быть как и длина, так и ширина, но также и площадь или объём (также: без public final class Length/Square/Volume). К примеру, /*int*/ color + /*double*/ weight лишено смысла, но с точки зрения Java это обычное сложение. Если я правильно понимаю как работает .NET, в нём довольно просто можно оградить от таких проблем простым использованием типов-значений:

private struct Age {
    private readonly int value;
    public Age(int value) { this.value = value; }
    public override string ToString() { return value.ToString(); }
    public override bool Equals(Object value) { return this.value.Equals(value); }
    public override int GetHashCode() { return this.value.GetHashCode(); }
    //public static implicit operator int(Age age) { return age.value; }
    //public static explicit operator Age(int age) { return new Age(age); }
}


что по цене использования памяти и быстродействию, если не ошибаюсь, будет почти (?) равно использованию обычного System.Int32. В Java такого нет, но, возможно, проверки на целостность можно поддерживать с помощью annotation-processing tool (APT), так как они позволяют реализовать своего рода плагины к javac (Lombok и lombok-pg -- отличные тому примеры). Есть ли готовые APT-ы или другие инструменты позволяющие отслеживать некорректные действия над примитивами? В моём понимании это могло бы быть что-то вроде:

@Color final int color = 0xFFCC00;
@Weight final double weight = 0.625;
System.out.println(color + weight);
                         ^_ предупреждение или ошибка; реакция IDE не важна


но

@Color final int color = 0xFFCC00;
@Weight final double weight = 0.625;
System.out.println((int) color + (double) weight);
                               ^_ всё в порядке, явное указанию компилятору считать это выражение корректным


Можно ли добиться такого эффекта в Java? Спасибо.
java типизация
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.