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

2022-09-01 21:17:11

为什么这是有效的?

傅.java

public class Foo {

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

    private class Bar {}

}

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


答案 1

我刚刚对此进行了一些研究,但无法找到明确的答案。这似乎很可能只是Java语言设计者的疏忽,因为它实际上并没有造成任何伤害,所以它已经离开了。这与将方法放入类中没有什么不同。没有什么能阻止您执行此操作,即使没有办法实际访问该方法。publicprivatepublic

当然,当您尝试执行此操作时,NetBeans 会给您一个警告“通过公共 API 导出非公共类型”。我预计大多数其他环境都会给出类似的警告。

返回的对象对于任何试图使用它的人来说都是完全无用的(除非他们使用反射),他们所能做的几乎就是将其存储到一个(或他们有权访问的任何其他超类)中,然后将其传递。ObjectObject

如果传递的被用作传递但从未操作的“句柄”,则可能需要执行此操作。在这种情况下,拥有类仍然更有意义,但使所有方法在其中,以防止它们在类外部作(或定义一个接口以返回并让类实现它)。Objectpublicprivatepublicprivate

所以答案似乎是:

它可能不应该是有效的,但由于它不会造成任何伤害,因此它从未被阻止过。

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

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


答案 2

为什么这是有效的?

由于调用位置中的客户端代码可能期望(或根本不期望任何内容),因此从任何位置调用此方法都没有问题:Object

Object o = new Foo().getBar();

推荐