首页 > 解决方案 > Java:Lombok 和展开属性

问题描述

我正在使用 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;

    }

}

我知道我可以使用 like:model.getStringProperty().get()来获取String价值,但如果它存在,我更喜欢直接的方式。

是否存在任何解决方案?

标签: javajavafxjavafx-8lombok

解决方案


我找到了一种方法:

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注释,您可以操纵您的 getter 名称,同时@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();
        }
    }

}

推荐阅读