Создание функций с помощью метапрограммирования stati c на Java / Kotlin - PullRequest
2 голосов
/ 06 мая 2020

У меня есть класс примерно с 40 переменными-членами. Теперь я хочу создать для них геттеры и сеттеры (им нужно запускать своего рода PropertyChangeEvent, а геттеры тоже не являются стандартными; но код практически одинаков для каждой переменной)

Вместо простого создания 80 функций и (вроде) все скопировать-вставить, я спрашиваю, можно ли это сделать с помощью (stati c) метапрограммирования (или чего-то другого, о чем я не знаю).

Я много делал с ruby раньше, где я бы просто написал sthg, например:

instance_variables.each do |var|
    define_method "get_#{var}" do
        return var if var.cached?
        return var = super
    end
    # ...
end

Я знаю, что Java и Kotlin совершенно разные, поскольку они скомпилированы и статически типизированы , но поскольку это действительно полезно, и подобные вещи возможны в C (препроцессор), C ++ и даже VHDL (для генерации), я не могу поверить, что это невозможно легко.

I ' Я читал, что аннотации - это точка, с которой нужно начинать в java, но я также читал, что с их помощью можно (обычно) не изменять существующие классы.

Я читал о Lombok, где ты может аннотировать поля для создания для них обычных Getters & Setters, функций hashCode и equals и многих других вещей, но разработчики отмечают, что это много хакерских действий с частными API-интерфейсами компилятора, которые могут сломаться в любой момент. Это не совсем то, что я хочу в первую очередь (поскольку моя IDE достаточно умна, чтобы просто создавать их, не требуя таких уловок).

Шаблонный код неприятен и размывает код, но копировать вставку реального кода - это что-то, что я ненавижу, поэтому вопрос.

Я должен признать, что я не знаю, как это выглядит для Kotlin, но слышал, что Extensions должны быть там точкой входа. Я тоже открыт для этого, если это будет проще (или, по крайней мере, возможно).

...