公共方法中的私有参数

Posted

技术标签:

【中文标题】公共方法中的私有参数【英文标题】:Private parameters in public methods 【发布时间】:2011-10-16 20:16:01 【问题描述】:

当非私有方法的参数是私有类型(例如私有嵌套类)时,g++ 和 javac 都不会发出警告。这些方法不能被客户端使用,但它们可以作为类的公共 API 的一部分出现。

例如,在 C++ 中,将此类方法放入类 Foo 的公共部分可以允许其他类访问这些方法,而无需在类 Foo 中明确列为朋友(只要它们可以访问用作参数)。

但总的来说,不明确地将此类方法设为私有会是一种不好的风格,还是可以忽略? (反正客户用不了,有什么大不了的)

【问题讨论】:

这是一个真正的错误还是你为什么要这样做? 【参考方案1】:

这是允许的,并且可能是必需的。

虽然您可能不允许创建私有类型的变量;它可能由函数返回。这将允许数据在系统周围传输,而不会在系统中没有理由持有对它的引用的部分中持久化。

这个成语不常见,但被允许。

【讨论】:

绝对有必要将私有类型作为通用 Object 实例返回,然后通过系统传递这些实例。但是,至少在 Java 中,需要这种类型作为参数的方法实际上不能由外部代码调用(可能通过反射除外)。相反,该方法需要将其参数作为对象接受,然后在内部强制转换为实际类型。 我刚试过:“w.foo(w.qux());”其中 qux() 返回 w 的私有内部类。这是从另一个类调用的。它起作用了,有点令我惊讶。使用 Java 6。 啊,我知道你在那里做了什么。聪明的。但是如果你喜欢Object qux = w.qux();,然后是w.foo(qux);,它就行不通了。所以本质上你不能保留w.qux()的结果以便以后重用,你必须在你想使用它的时候调用它。 感谢@aroth 的夸奖。我同意你的评论;您必须在想使用它时致电w.qux()。这使得“Replace Query with Temp”重构无法使用;这就是为什么我认为这种不好的风格。就像我说的那样,我有点惊讶它居然奏效了。【参考方案2】:

在风格上,我不得不想象将这些方法作为公共 API 的一部分会被认为是糟糕的风格。使用库时,您是否真的希望看到在 IDE 的自动完成对话框中弹出实际上无法调用的方法?我不这么认为。

至于为什么没有编译器警告,在大多数(也许是全部?)面向对象的语言(当然在 Java 中)中,用户定义的对象类型只是使用指针传递给方法。因此,无需了解实际类型即可将引用作为函数参数传递,只需了解指针即可。而且就编译器而言,每个人都知道如何创建指针,因此说“您实际上不能在外部调用它”是没有根据的。至少您可以使用 null 的值调用它。

【讨论】:

缺少警告,至少对于 C++ 而言,是因为编译器无法判断一个类型是否是严格私有的;要发出警告,它必须依赖一个非常智能的链接器(它会做出很多假设)。 +1 即使这个成语有有效的用途,除非专门用于这样的用途,否则它可能是不好的风格

以上是关于公共方法中的私有参数的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中的公共方法中获取私有方法值

不能使用公共嵌套类作为私有方法参数

从 javascript 类中的“私有”方法访问“公共”方法

Python 中的“公共”或“私有”属性?啥是最好的方法?

如何使用 JUnit 在 Spring Boot 中的公共方法中模拟私有方法

打字稿:使父类中的公共方法成为派生类中的私有/受保护方法