【问题标题】:Access private inner class with Lombok使用 Lombok 访问私有内部类
【发布时间】:2019-11-30 21:42:04
【问题描述】:

让我们来看看下面这个带有静态内部类的类。

@Getter
@Setter
public class Request {
    private String contactUrl;
    private Resources resources;

    @Getter
    @Setter
    private static class Resources {
        private String basketId;
        private String customerId;
    }
}

我需要像这样从另一个类访问basketId

Request request = new Request();
request.getResources.setBasketId("5");

除非我将Resources 类定义为public,否则不会编译。

在保持Resources 私有的同时使用Lombok 访问该字段还有其他方法吗?

【问题讨论】:

  • 公开内部类有什么问题?如果它是从 getter 中返回的,那么用户已经知道它的存在以及它有哪些方法。您想通过将其设为私有来实现什么目标?
  • 非静态内部类对象需要封闭类的对象,而嵌套(静态)类对象则不需要。这是一个正当的理由,尽管我并不是说这是 OP 的理由。

标签: java lombok


【解决方案1】:

您可以使用@Delegate 有效地将私有内部类具有的每个方法“复制”到外部(并且实现只是在内部调用该方法):

@Delegate private Resources resources;

请注意,在签名中使用类型(构造函数、字段、方法等 - 类型的非代码方面)使得该类型比签名更不可见,真的很奇怪:这里有一个公共方法,它为不在这个文件中的所有代码返回一个有效的不可见类型(资源)。这是一个坏主意;没有人可以有用地调用此方法。要么去掉 getter 和 setter(例如,改用 Delegate),要么公开 Resources 内部类。

让我们退后一步:您想要完成什么?例如,如果您不希望任何人在外部不知情的情况下使用内部 Resources 类,这很容易做到:只需在 Resources 中创建一个私有构造函数,然后,瞧。现在除了你的外,没有人可以创建实例。

【讨论】:

    【解决方案2】:

    要保持Resources 私有,您可以委托setter 方法,例如:

    @Getter
    @Setter
    public class Request {
        private String contactUrl;
        private Resources resources;
    
        @Getter
        @Setter
        private static class Resources {
            private String basketId;
            private String customerId;
        }
    
        public setBasketId(String id) {
            resources.setBasketId(id)
        }
    }
    
    

    或者你可以使用反射:Set private field value with reflection

    【讨论】:

    • 谈到委托时,您可能会使用@lombok.Delegate private Resources resources。但我不确定以这种方式暴露内部类细节是否比暴露类本身更好。
    猜你喜欢
    • 2011-02-17
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2017-07-13
    • 2010-10-03
    相关资源
    最近更新 更多