首页 > 解决方案 > 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);
    }
}

声明Dataprotected将停止getData()正常工作。减少构造函数的访问修饰符Data会阻止子类Parent正常工作。我想要的是类似的东西protected-by-parent,我猜它在 Java 中不存在。

有合适的解决方法吗?我可以看到的一种可能性是创建一个protected方法,该方法有效地从(将被制作)Parent的构造函数进行镜像、调用和返回。然而,这似乎有点混乱。有人知道更好的方法/设计吗?Dataprivate

标签: javainner-classesaccess-modifiers

解决方案


更好的解决方案是制作嵌套类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());
    }
}

推荐阅读