为啥这里的 String 构造函数应该被保护而不是私有?
Posted
技术标签:
【中文标题】为啥这里的 String 构造函数应该被保护而不是私有?【英文标题】:Why should the String constructor be protected instead of private here?为什么这里的 String 构造函数应该被保护而不是私有? 【发布时间】:2011-04-15 20:31:42 【问题描述】:我有点卡在这个 SCJP 练习问题上,特别是第 5 行(使用 String 构造函数)。我认为它应该是私有的,但解决方案是“受保护的”。我认为受保护的访问不能满足所有 Alpha 实例都将 String alpha 设置为 A 的要求。如果构造函数受到保护,那么也在包 alpha 中的任何其他类,或者 Alpha 的任何子类,无论包如何,都可以调用它并将 alpha 设置为它想要的任何值。阿米尔特?谁能澄清一下?谢谢!
【问题讨论】:
这是一个不可能的问题。如果我这样做:Alpha a = new Beta("Not A")
,我创建了一个违反规则 3 的 Alpha
对象。
@Eric:是的。这是一个糟糕的问题:(
【参考方案1】:
如果构造函数是私有的,Beta 将如何调用super(a)
?
所以它不能是私有的......但你是对的:如果它是protected
,那么同一个包中的其他类型确实可以调用
new Alpha("some other value")
换句话说,我不相信private
是正确的答案,但我不相信有 是正确的答案。您不能将可见性限制为 仅 Java 中的派生类。
编辑:我明白了:)
使Alpha
抽象化,并使用构造函数做你喜欢的事情,只要它对Beta
可见(public
或protected
都可以)。这样第三个条件就自动成立了,因为永远不会只有Alpha
!
package alpha;
public abstract class Alpha
final String alpha;
Alpha() this("A");
public Alpha(String a) alpha = a;
package beta;
public class Beta extends alpha.Alpha
public Beta(String a) super(a);
现在,确实需要对第 1 点进行一些狡猾的解释。我认为Beta
的实例是Alpha
的实例(毕竟,instanceof
将返回 true :) 以便满足第 1 点,但 Beta
的实例不是“Alpha
类型的对象”,所以第 3 点仍然可以。
【讨论】:
触摸!但这仍然不能解释如何通过使用 protected 来满足“alpha 永远不会改变”的要求。事情是这样的,它可以改变,对吧?它也不能确保 alpha 始终为“A”。你可以很容易地说 Alpha a1 = new Alpha("B"); 是的,“没有正确答案”更符合我的预期。然而,这应该在“真正的”考试中出现。太棒了。 @Anita:“alpha 永远不会改变”的要求完全独立于构造函数位。只需将其设为final
(最好是私有的)即可。但它是“也不能确保 alpha 始终为“A””位,无论您做什么都不起作用。
我可能是唯一一个想念private protected
:-)
@Anita:我想出了一个解决方案。这太可怕了,我怀疑这是否是预期的,但它满足要求。查看我的编辑 - 我会在一分钟内输入代码。以上是关于为啥这里的 String 构造函数应该被保护而不是私有?的主要内容,如果未能解决你的问题,请参考以下文章