私有类作为公共方法的返回类型

Noe*_*tin 24 java polymorphism access-modifiers

为什么这个有效?

Foo.java

public class Foo {

    public Bar getBar() {
        return new Bar();
    }

    private class Bar {}

}
Run Code Online (Sandbox Code Playgroud)

如果Bar是私有的,那么这个类的用户将如何使用此方法?当然可以使用多态,但这不应该是无效的,并且声明应该指出这是返回一个对象吗?

Tim*_*m B 10

我刚刚对此进行了一些研究,但未能找到明确的答案.它似乎很可能只是Java语言设计者的疏忽,因为它实际上并没有造成任何伤害.将public方法放入private类中并没有什么不同.即使没有办法实际访问该public方法,也没有什么能阻止你这样做.

当然,当您尝试执行此操作时,NetBeans会向您发出警告"通过公共API导出非公共类型".我希望大多数其他环境会发出类似的警告.

返回的对象对尝试使用它的人来说完全没用(除非他们使用反射),他们几乎所能做的就是将它存储到Object(或者他们有权访问的任何其他超类)中然后传递它Object.

如果传递Object被用作传递但从未操作的"句柄",则可能希望这样做.在这种情况下,虽然拥有类仍然更有意义,public但是在其中创建所有方法private以防止它们在类外部执行(或定义public返回的接口并使private类实现该类).

所以答案似乎是:

它可能不应该有效,但因为它没有造成任何伤害,它从未被阻止过.

对于类似的主题,这里有一个很好的答案:

通过公共API导出非公共类型

  • 实际上,只要类实现了一些接口,在适当设计的Java代码中返回私有类是非常常见和有用的.Java库一直都在做.虽然他们可能会返回接口类型而不是私有类类型. (2认同)