公共方法如何返回私有类型?

Mon*_*eur 5 java oop visibility

为什么可以private从类中的public方法返回嵌套public类?编译器是否应该抱怨返回类型的可见性小于方法?

public final class Outer {
    private static final class Configurator {
        private Configurator() {
        }
    }

    public static Configurator configure() {
        return new Configurator();
    }
}
Run Code Online (Sandbox Code Playgroud)

Dun*_*nes 4

可以从类外部调用此类方法,但前提是您愿意丢弃结果。

public class TestClass {
  public static void main(String[] args) throws Exception {
    Outer.configure(); // this is valid
  }
}
Run Code Online (Sandbox Code Playgroud)

或者如果您愿意将结果称为Object

public class TestClass {
  public static void main(String[] args) throws Exception {
    Object o = Outer.configure(); // this is valid
  }
}
Run Code Online (Sandbox Code Playgroud)

编译器允许这样做,因为它不会违反 Java 的任何规则。Object只是您的私有类的唯一公开的超类。

我怀疑这种模式有很多实际用途。如果您希望返回一个不透明的对象,最好通过传回一个没有公共方法的公共类来完成,因为您至少可以在传回需要使用它的类时对其进行类型检查。