使用 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,这很容易做到:只需在资源中创建一个私有构造函数,然后,瞧。现在除了你的外层没有人可以创建实例了。
让我们采用以下 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,这很容易做到:只需在资源中创建一个私有构造函数,然后,瞧。现在除了你的外层没有人可以创建实例了。