使用Lombok访问私有内部类

4

让我们来看一个带有静态内部类的类。

@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,否则这段代码不会被编译。

有没有其他使用Lombok访问私有Resources字段的方法?


1
将内部类公开的问题是什么?如果它从getter返回,用户已经知道它的存在和拥有的方法。通过将其设置为私有,您想要实现什么目的? - Bohemian
非静态内部类对象需要一个封闭类的对象,而嵌套(静态)类对象则不需要。这是一个有效的理由,尽管我不认为这是 OP 的原因。 - clapas
2个回答

4
你可以使用@Delegate来有效地“复制”你的私有内部类拥有的每个方法到外部(并在实现中调用该方法内部类):
@Delegate private Resources resources;

请注意,在签名中使用的类型(构造函数、字段、方法等-类型的非代码方面),如果该类型比签名不可见,那么就是非常奇怪的:在这里,您有一个公共方法,返回一个对于不在此文件中的所有代码来说都是有效无形的类型(Resources)。这是个坏主意,没有人能够有用地调用这个方法。要么去掉getter和setter(例如,使用Delegate),要么将Resources内部类设为public。
让我们退一步:你想实现什么目标?例如,如果你不希望任何人在外部不知情的情况下使用这个内部Resources类,那很容易做到:只需在Resources中创建一个私有构造函数即可,然后,Voila,现在除了外部,没有人可以创建实例了。

1
为了保护资源的私密性,您可以委派setter方法,例如:

Resources保持私有化:

@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)
    }
}

或者您可以使用反射:使用反射设置私有字段的值


当谈到委托时,您可能会使用@lombok.Delegate private Resources resources。但我不确定以这种方式公开内部类细节是否比公开类本身更好。 - maaartinus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接