公共方法中的私有参数

4
当非私有方法的参数是私有类型(例如私有嵌套类)时,g++和javac均不会发出警告。这样的方法无法被客户端使用,但可以作为类公共API的一部分显示。
在C++中,将这些方法放入类Foo的公共部分中,例如,可以允许其他类访问这些方法,而无需在类Foo内明确列出它们为友元(只要它们可以访问用作参数的私有类型)。
但通常情况下,不明确将这些方法设为私有是否不好的风格,还是可以忽略它(因为客户端无法使用它,所以没什么关系)。

这是一个真正的错误吗?还是你为什么想要这样做呢? - mP.
2个回答

4

这是被允许的,有时也是必需的。

虽然你可能不能创建一个私有类型的变量;但它可能会被函数返回。这将允许数据在系统中传输,而无需在没有引用它的部分持久存在。

这种说法并不常见,但是是被允许的。


有理由将私有类型作为通用对象实例返回,并通过系统传递这些实例。然而,至少在Java中,需要将此类类型作为参数的方法实际上无法被外部代码调用(除非可能通过反射)。相反,该方法需要将其参数接受为Object,然后在内部进行转换为实际类型。 - aroth
我刚试了一下:"w.foo(w.qux());"其中qux()返回w的一个私有内部类。这是从另一个类调用的。令我有些惊讶的是,它确实起作用了。使用Java 6。 - S.L. Barth
啊,我明白你的意思了。很聪明。但是如果你像这样做Object qux = w.qux();,然后稍后再跟着w.foo(qux);,它就不起作用了。因此,实质上你不能保存w.qux()的结果以便以后重复使用,你必须在每次使用时调用它。 - aroth
谢谢你的赞美,@aroth。我同意你的评论; 每当你想使用它时,你必须调用w.qux()。这使得“用临时变量取代查询”的重构无法使用;这就是为什么我认为这是一种不好的风格。像我说的那样,我有点惊讶它居然能运行。 - S.L. Barth

3
从风格上来看,我认为将这些方法作为公共API的一部分会被认为是不好的风格。当您使用库时,在IDE的自动完成对话框中出现您实际上无法调用的方法,这真的是您想要看到的吗?我不这么认为。
至于为什么没有编译器警告,在大多数(也许所有?)面向对象的语言中(当然包括Java),用户定义的Object类型只是使用指针将其传递给方法。因此,为了将引用传递给函数参数,不需要知道实际类型,只需要知道指针。就像编译器关心的那样,每个人都知道如何创建指针,因此它没有依据说“您实际上无法从外部调用它”。至少您可以使用null值调用它。

至少对于C++来说,缺乏警告是因为编译器无法确定类型是否严格私有;要发出警告,它必须依赖于非常聪明的链接器(做出很多假设)。 - Alex Churchill
+1 即使这个习语有其有效的用法,除非特别打算使用它,否则它可能是不好的风格。 - ManRow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接