Java - 私有构造函数vs final和更多

时间:2013-08-30 00:52:34

标签: java eclipse constructor extending

假设有一个类,其所有构造函数都声明为private。

例如:

public class This {
    private This () { }

    public someMethod( ){
    // something here
    }
   // some more-- no other constructors
}

据我所知,将所有构造函数设为私有类似于将“This”类声明为 final - 因此无法扩展它。

然而,我得到的Eclipse消息给我的印象是这是可能的 - 可以扩展所有构造函数 - 私有类。看看这个:

当我尝试用类似

的东西扩展这个类时
public class That extends This {
    ...
}

Eclipse给我一个错误:“隐式超级构造函数This()对默认构造函数不可见。 必须定义一个显式构造函数。

当我定义自己的构造函数时:

public class That extends This {
    That () {..} 
    ...
}

这次我得到: “隐式超级构造函数This()对于默认构造函数不可见。 必须显式调用另一个构造函数。

有没有办法绕过这个 - 扩展一个所有构造函数都是私有的类?

如果是,怎么样?

如果不是,那么阻止一个类被延长的区别是什么 i。)使其构造函数成为私有的 ii。)将其定义为最终

注意:我在其他一些讨论中看到Can a constructor in Java be private?

3 个答案:

答案 0 :(得分:20)

您声明了一个类final而不是因为不同的原因而使其构造函数private

  • 您使类final表示该类不是为继承而设计的。
  • 使所有构造函数private为该类提供对其实例化的控制。

换句话说,使用final控制继承,而使用private构造函数控制实例化。

请注意,声明构造函数private仅禁用外部继承。在类中,您仍然可以使用命名或匿名派生类继承它。

当你创建类private的所有构造函数时,你需要一个公共的static方法来使类可用。一种常见的static方法是工厂方法:您可以让类的用户通过公共静态方法间接调用私有构造函数。

答案 1 :(得分:3)

除了同一个类中的表单外,无法实例化具有私有构造函数的类。这使得从antoher类扩展它是无用的(可能,但不会编译)。

这并不意味着它根本不能被子类化,例如在内部类中你可以扩展并调用私有构造函数。

答案 2 :(得分:1)

据我所知,private构造函数的一般用途是确保通过其他方法(即静态方法)完成对象构造。例如:

public class Something {

    private Something() { }

    public static Something createSomething() {
        Something ret = new Something();
        // configure ret in some specific way
        return ret;
    }

}

因此私有构造函数限制了类的实例化方式(而不是如何扩展)。

另一方面,将类标记为final用于明确表示无法扩展类。如何实例化完全是另一回事。

所以虽然我不是100%,如果有某种方法来扩展一个拥有所有私有构造函数的类 - 问题是你为什么要这样做?拥有私有构造函数并将类标记为final有两个不同的目的。