Java: свойства Lombok и развертывания - PullRequest
0 голосов
/ 27 марта 2019

Я работаю со свойствами JavaFx и Lombok

Я недавно начал использовать Lombok, он делает мой код намного проще и читаемее, но у меня есть проблема со свойствами JavaFx, он не разворачивает их, как если бы я генерировал их с IntelliJ. Я получаю геттер для самого свойства и Геттер для стоимости. Вот простой пример с объяснением того, что я хочу сделать.

public class LombokAndProperties {

    public static void main(String[] args) {
        Model model = new Model();

        model.getStringProperty(); // returns the StringProperty instead of String
        model.stringProperty(); // doesn't exist -> doesn't compile

        // Expectation:
        // model.getStringProperty() <- return the String that is stringProperty.get()
        // model.stringProperty() <- return the StringProperty itself
    }


    @Getter
    private static class Model{

        private StringProperty stringProperty;

    }

}

Я знаю, что могу использовать как: model.getStringProperty().get() для получения значения String, но я бы предпочел прямой путь, если он существует.

Существует ли какое-либо решение для этого?

1 Ответ

0 голосов
/ 27 марта 2019

Я нашел способ:

public class LombokAndProperties {

    public static void main(String[] args) {
        Model model = new Model();

        model.getStringProperty(); // <- return the String that is stringProperty.getStringProperty()
        model.stringProperty(); // <- return the StringProperty itself

    }



    private static class Model{

        private interface DelegateExample {
            String getStringProperty();
        }

        @Accessors(fluent = true)
        @Getter
        @Delegate(types = DelegateExample.class)
        private StringProperty stringProperty = new StringProperty();

    }

    private static class StringProperty {
        String property = "p";

        public String getStringProperty(){
            return property;
        }
    }
}

С помощью аннотации @Accessor вы можете манипулировать именем получателя, а @Delegate - шаблоном делегирования. Вы можете найти больше здесь и здесь . Однако обратите внимание на две вещи: во-первых, эти примечания помечены как «экспериментальные» командой Lombok. Во-вторых, для меня это довольно запутанный API, поэтому используйте его осторожно.

Если это решение слишком сложное, я бы предложил принять только @Accessor и создать собственный метод делегата:

public class LombokAndProperties {

    public static void main(String[] args) {
        Model model = new Model();

        model.getStringProperty(); // <- return the String that is stringProperty.get()
        model.stringProperty(); // <- return the StringProperty itself

    }

    private static class Model{

        @Accessors(fluent = true)
        @Getter
        private StringProperty stringProperty;

        public String getStringProperty(){
            return stringProperty.get();
        }
    }

}
...