为啥这里的 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 可见(publicprotected 都可以)。这样第三个条件就自动成立了,因为永远不会只有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 构造函数应该被保护而不是私有?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该在构造函数而不是 ngOnInit 中创建我的 Angular2 响应式表单?

为啥在 CDI 中使用构造函数而不是 setter 注入?

为啥在这里调用构造函数?

为啥Java抽象类中需要受保护的构造函数

子类为啥不能直接调用父类的属性

为啥不应该使用 Number 作为构造函数? [复制]