Java - 使静态嵌套 class 对所有人可见,但仅由父级和父级的子 class 构造
Java - make static nested class visible to all, but only constructed by parent and subclasses of parent
我有一个父级 class,其中包含嵌套的类结构静态 class。嵌套的 class 必须是 public,因为它应该被返回到其他 classes,在那里它的内容被执行。但是,只有父 class 及其子 classes 应该能够实例化嵌套 class,因为它们知道如何定义其内容.下面显示的所有 classes 都在不同的包中。
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
class protected
会阻止 getData()
正常工作。减少 Data
的构造函数的访问修饰符会阻止 Parent
的子 classes 正常工作。我想要的是 protected-by-parent
之类的东西,我猜它在 Java.
中不存在
是否有合适的解决方法?我可以看到的一种可能性是在 Parent
中创建一个 protected
方法,它可以有效地从 Data
的构造函数中镜像、调用和 returns (这将是 private
).然而,这似乎有点混乱;有人知道更好的 way/design 吗?
更好的解决方案是使嵌套 class protected
,并使其实现 public
接口。只有接口会暴露给外部 classes,而嵌套的 class 本身将保留一个实现细节。
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());
}
}
您不能为外部 class 的子 class 构造静态成员 class protected
的构造函数。这种表现力并不直接存在于 Java 语言中。
但是,您可以使静态成员的构造函数 class Data
private
- 在这种情况下,外部 class 仍然可以访问它。并且外部 class 可以定义一个受保护的工厂方法来调用 Data
构造函数 - 通过使其成为 protected
,它只能由 Parent 本身访问,subclasses,并且所有 class 都在同一个包中(protected
修饰符总是如此)
public abstract class Parent
{
protected static Data createData(String d1, ...) {
return new Data(d1, ...);
}
public static class Data
{
public final String data1
...
private Data(String d1, ...)
{
data1 = d1;
...
}
}
public abstract Data getData();
}
我有一个父级 class,其中包含嵌套的类结构静态 class。嵌套的 class 必须是 public,因为它应该被返回到其他 classes,在那里它的内容被执行。但是,只有父 class 及其子 classes 应该能够实例化嵌套 class,因为它们知道如何定义其内容.下面显示的所有 classes 都在不同的包中。
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
class protected
会阻止 getData()
正常工作。减少 Data
的构造函数的访问修饰符会阻止 Parent
的子 classes 正常工作。我想要的是 protected-by-parent
之类的东西,我猜它在 Java.
是否有合适的解决方法?我可以看到的一种可能性是在 Parent
中创建一个 protected
方法,它可以有效地从 Data
的构造函数中镜像、调用和 returns (这将是 private
).然而,这似乎有点混乱;有人知道更好的 way/design 吗?
更好的解决方案是使嵌套 class protected
,并使其实现 public
接口。只有接口会暴露给外部 classes,而嵌套的 class 本身将保留一个实现细节。
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());
}
}
您不能为外部 class 的子 class 构造静态成员 class protected
的构造函数。这种表现力并不直接存在于 Java 语言中。
但是,您可以使静态成员的构造函数 class Data
private
- 在这种情况下,外部 class 仍然可以访问它。并且外部 class 可以定义一个受保护的工厂方法来调用 Data
构造函数 - 通过使其成为 protected
,它只能由 Parent 本身访问,subclasses,并且所有 class 都在同一个包中(protected
修饰符总是如此)
public abstract class Parent
{
protected static Data createData(String d1, ...) {
return new Data(d1, ...);
}
public static class Data
{
public final String data1
...
private Data(String d1, ...)
{
data1 = d1;
...
}
}
public abstract Data getData();
}