将类作为final并将类构造函数设置为private是有区别的

时间:2011-09-07 16:10:29

标签: java constructor final

最终类和将类构造函数设置为私有之间究竟有什么区别。

我知道两者都不能被分类(如果我错了,请纠正我)。他们有什么不同吗?

6 个答案:

答案 0 :(得分:9)

最后一堂课不能延期。它阻止了这个

final class FinalClass {

}

// and later

class ExtendedClass extends FinalClass { // ERROR

}

这对像String这样的东西很有用 - 你不希望有人能够覆盖String的逻辑,这是最常用的对象之一,并且能够,哦,我不知道,添加网络和发送你使用的所有字符串。如果可以扩展String,则可以这样做。

无法在类外部调用私有构造函数。

class PrivateCons {

    private PrivateCons() {

    }
}

// later
PrivateCons pc = new PrivateCons(); // ERROR

通常最终会像这样工作:( java.lang.Math是一个很好的例子)

class FuncLib {
    private FuncLib() { } // prevent instantiation
    public static void someFunc(...) { }
    public static int anotherFunc(...) { }
}

或者它最终像这样工作//整数实际上是这样做

class VerySpecial {

    private static Map<String,VerySpecial> cache;

    public static VerySpecial generate(String data) {
        VerySpecial result = cache.get(data);
        if(result == null) {
            result = new VerySpecial(data);
            cache.put(data,result);
        }
        return result;
    }

    private String data;

    private VerySpecial() { }

    private VerySpecial(String data) { this.data = data}

}

扩展类时,默认情况下构造函数会尝试调用默认(无参数)构造函数。如果它是私有的,那么在扩展它时必须显式调用非私有构造函数。如果您没有非私有构造函数来调用,则无法扩展它。 感谢您提出意见并指出这一点。 : - )

答案 1 :(得分:5)

实例化

  • 您无法使用私有构造函数实例化类。但是您可以将它用作静态方法的实用程序类。
  • 最后一个类可以实例化但不能扩展,显然你不能扩展一个类 一个私有构造函数,因为隐式的super()调用会失败。

看看它有一个私有构造函数的Math类,无法实例化它有很多非常有用的静态方法

答案 2 :(得分:1)

只有私有构造函数比最终类更强。

详细说明: 在类A中只有私有构造函数会强烈影响对象的创建。通常,您使用的是工厂方法。您仍然可以使用技巧(例如clone()或反射调用私有构造函数)在没有工厂方法的情况下创建A的实例。但子类化是不可能的,因为子类的构造函数需要能够调用super()。这只能在A内的嵌套类中实现。

只有私有构造函数通常才有意义,例如通过工厂方法控制实例化,例如对于singeltons(参见Effective Java item 3)。但即使在这种情况下,我也没有理由不编写“最终类”,只是为了文档,以便读者立即掌握不允许子类化。

答案 3 :(得分:1)

如果您不希望您的班级被分类,那么您使用final。如果您不希望其他类实例化您的类,而是希望控制对象的构造和维护方式,则使用私有构造函数。

答案 4 :(得分:0)

内部类可以访问

private个成员。

public class Outer {
  private Outer() {
    System.out.println("Outer()");
  }

  static class Inner extends Outer {
    {
      System.out.println("Inner()");
    }
  }

  public static void main(String... args) {
    new Inner();
  }
}

打印

Outer()
Inner()

最终的类不能扩展,但它的构造函数可以是公共的。私有构造函数可以从另一个构造函数调用,也可以由内部类使用。

答案 5 :(得分:0)

最终的类/方法永远不能被继承/覆盖,并且会抛出编译错误,因为具有私有构造函数的类也会抛出编译,而且没有默认构造函数可用于您的类&#39;一旦你添加了一个非最终构造函数并从你的子类中调用它,就不会有错误。

私有构造函数在创建单例类(仅存在一个类的实例)的情况下非常有用,其中您将构造函数设为私有,并使用变量来存储单个实例,这将使用公共静态方法公开。 对于前。

public class Singleton{    
private static final Singleton instance = new Singleton();

//private constructor to avoid client applications to use constructor
private Singleton(){}

public static Singleton getInstance(){
    return instance;
}}

例如,java中的String类是最终类。