使用 Lombok 访问私有内部 class

Access private inner class with Lombok

让我们采用以下 class 静态内部 class。

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

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

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

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

除非我将 Resources class 定义为 public.

,否则无法编译

有没有其他方法可以使用 Lombok 访问此字段同时保持 Resources 私有?

要保持​​ 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)
    }
}

或者你可以使用反射:

您可以使用 @Delegate 有效地 'copy' 您的私有内部 class 对外部具有的每个方法(并且实现只是在内部调用该方法):

@Delegate private Resources resources;

请注意,在签名(构造函数、字段、方法等 - 类型的非代码方面)中使用类型,使得该类型比签名更不可见,是 真的很奇怪:这里有一个 public 方法,它 returns 对于不在这个文件中的所有代码来说是一种有效的不可见类型(资源)。这是一个坏主意;没有人可以有用地调用此方法。要么摆脱 getter 和 setter(例如,改用 Delegate),要么使 Resources inner class public.

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