java - Java - 使静态嵌套类对所有人可见,但仅由父类和父类的子类构造
问题描述
我有一个包含类似结构的静态嵌套类的父类。嵌套类必须是公共的,因为它应该返回到对其内容进行操作的其他类。但是,只有父类及其子类才能实例化嵌套类,因为它们知道如何定义其内容。下面显示的所有类都在不同的包中。
public abstract class Parent
{
public static class Data
{
public final String data1
...
public Data(String d1, ...)
{
data1 = d1;
...
}
}
public abstract Data getData();
}
public final class Subclass extends Parent
{
@Override
public Data getData()
{
return new Data(.....);
}
}
public class SomeOtherClass
{
public void someMethod()
{
final Data d = new Subclass().getData();
System.out.println(d.data1);
}
}
声明Data
类protected
将停止getData()
正常工作。减少构造函数的访问修饰符Data
会阻止子类Parent
正常工作。我想要的是类似的东西protected-by-parent
,我猜它在 Java 中不存在。
有合适的解决方法吗?我可以看到的一种可能性是创建一个protected
方法,该方法有效地从(将被制作)Parent
的构造函数进行镜像、调用和返回。然而,这似乎有点混乱。有人知道更好的方法/设计吗?Data
private
解决方案
更好的解决方案是制作嵌套类protected
,并使其实现public
接口。只有接口会暴露给外部类,而嵌套类本身将保留实现细节。
public abstract class Parent
{
public interface Data {
public String getData1();
}
protected static class DataImpl implements Data
{
private final String data1;
...
protected DataImpl(String d1, ...)
{
data1 = d1;
...
}
public String getData1(){
return data1;
}
}
public abstract Data getData();
}
public final class Subclass extends Parent
{
@Override
public Data getData()
{
return new DataImpl(.....);
}
}
public class SomeOtherClass
{
public void someMethod()
{
final Data d = new Subclass().getData();
System.out.println(d.getData1());
}
}
推荐阅读
- python-3.x - 如何提高数据加载性能python
- javascript - 解析错误;JavaScript中的意外令牌索引
- python-3.x - 在特定字符之间搜索最后一组文本
- bash - Git别名在克隆时自动为个人回购信息添加前缀?
- ios - 每次我在 Swift 中使用它时都必须启动一个 BLE 外围设备
- javascript - 来自 react-router-dom 的提示问题未触发
- mysql - 在存储过程中调用存储过程并将结果设置为变量时出现问题
- typescript - VSCode API:在终端中运行命令并使用输出
- python - 如何在 PyQt5 中为屏幕上的点移动设置动画
- javascript - 如何在 URL 中调用 echo 包括?