如何在Java中构造一个不可实例化的AND不可继承的类

Ash*_*lix 14 java

问题就是这一切.我知道Singleton模式(同类的最终版)是一个解决方案.我们还有其他可能的方法吗?抽象类使其不可实例化.最终使它成为不可继承的.我们如何结合两者?

public final class SingletonObject
{
  private SingletonObject()
  {
    // no code req'd
  }

  /*public static SingletonObject getSingletonObject()
  {
    if (ref == null)
        // it's ok, we can call this constructor
        ref = new SingletonObject();        
    return ref;
  }*/

  public Object clone()
    throws CloneNotSupportedException
  {
    throw new CloneNotSupportedException(); 
    // that'll teach 'em
  }

  private static SingletonObject ref;
}
Run Code Online (Sandbox Code Playgroud)

代码参考:http://www.javacoffeebreak.com/articles/designpatterns/index.html

Boh*_*ian 37

制作构造函数private:

public final class Useless {
    private Useless() {}
}
Run Code Online (Sandbox Code Playgroud)

私有构造函数是面向对象的常规解决方案.但是,仍然可以使用反射来实例化这样的类,如下所示:

Constructor<Useless> con = Useless.class.getDeclaredConstructor();
con.setAccessible(true); // bypass "private"
Useless object = con.newInstance();
Run Code Online (Sandbox Code Playgroud)

要防止反射工作,请从构造函数中抛出异常:

public final class Useless {
    private Useless() {
        throw new UnsupportedOperationException();
    }
}
Run Code Online (Sandbox Code Playgroud)


Pio*_*zda 6

你的意思是只有静态方法的类?类不能是最终的和抽象的.但是你可以使用私有构造函数使它不是即时的.

final class StaticOnly {

    private StaticOnly() {
        throw new RuntimeException("Do not try to instantiate this");
    }

    public static String getSomething() {
       return "something";
    }
}
Run Code Online (Sandbox Code Playgroud)

下面的例子将起作用.你不会实例化它,因为它是抽象的.你不会继承它,因为没有办法从外部子类调用超级构造函数(只有内部子类可以工作)

abstract class StaticOnly {

    private StaticOnly() {}

    public static String getSomething() {
         return "something";
    }
}
Run Code Online (Sandbox Code Playgroud)

枚举也会奏效

enum StaticOnly {
    S;

    public static String getSomething() {
        return "something";
    }
}
Run Code Online (Sandbox Code Playgroud)

但它总是至少有一个实例(这里是S).

  • 事实上,你可以有一个没有任何实例的枚举,只记得放置';' 在定义成员之前. (3认同)

Pet*_*rey 5

我会使用最简单的单例模式

enum Singleton {
    INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)

enum类型是不可实例化且不可继承的,并且类初始化是惰性的且线程安全的。

要声明永远不应该有实例,您也可以使用枚举

enum Utilities {
    ; // no instances

    // add static methods here
}
Run Code Online (Sandbox Code Playgroud)