Как человеку, воспитанному на С++, мне зело не хватает в Java плюсового typedef.
Есть ли какие-нибудь нормальные способы получить схожую функциональность в Java? Я хочу получить семантическую целостность своих типов данных. У меня в проекте множество данных передается как String или int. Но по сути там передаются совершенно разные типы данных. Например, у объектов есть Id, InstanceId, ResourceId и пр., передаваемые как String и иногда по ошибке девелоперы могут взять Id и передать его туда, где ожидается ResourceId. Синтаксически проблем нет — и там и там строки, но логически это ошибка. И отследить эту ошибку порой сложно. Я хотел бы получить какой-нибудь ворнинг от компилятора в таких местах.
В С++ я сделал бы это через typedef, но в Java такой фичи нет. Те алиасы для типов, которые можно объявить через using, это совершенно не то, оно работает только в рамках одного файла. Другое решение, приходящее на ум — унаследоваться бы от стандартных типов, что-нибудь вроде этого:
public class InstanceIdType extends String
Но так сделать нельзя, ибо класс String объявлен как "final", закрыт для наследования.
Пока на ум приходит создание классов-оберток, имеющих внутреннее поле типа String или int, но это ж приведет к созданию кучи дополнительных мелких объектов в рантайме. Не хочется жертвовать производительностью и памятью.
Может есть какие-то другие способы? Какие-нибудь волшебные аннотации, подсказывающие, когда String можно передавать в метод, ожидающий String, а когда нельзя? Среда разработки — Intellij IDEA, но в идеале нужно бы универсальное решение, чтоб везде работало, т.к. некоторые разработчики используют Eclipse.