如何让一个类不能被实例化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让一个类不能被实例化相关的知识,希望对你有一定的参考价值。

本文涉及的概念:
1.在面向对象编程中,在什么场景下会需要做到让一个类不能被实例化
2.让一个类不能被实例化的方法
 
 
什么样的场景会需要让一个类不能被实例化
工具类(utility class),实例化对它们没有意义的工具类。这时候,就要做到不让该类被实例化
java.lang.Math:
把与Math相关的基本类型的值和相关的方法组合到该Math类中。Math类不需要实例化,使用了私有构造器。不过,它可以在Math类中内部被实例化。
使用私有构造器,没有子类;使用final修饰,没有子类。
package java.lang;
import java.util.Random;
 
public final class Math {
 
  /**
  * Don‘t let anyone instantiate this class.
  */
  private Math() {}
 
  /**
  * The {@code double} value that is closer than any other to
  * <i>e</i>, the base of the natural logarithms.
  */
  public static final double E = 2.7182818284590452354;
 
  public static final double PI = 3.14159265358979323846;
 
  public static double sin(double a) {
  return StrictMath.sin(a); // default impl. delegates to StrictMath
  }
 
....    
  public static double toRadians(double angdeg) {
  return angdeg / 180.0 * PI;
  }
 
  public static float scalb(float f, int scaleFactor) {
  return sun.misc.FpUtils.scalb(f, scaleFactor);
  }
}
 
 
让一个类不能被实例化的方法
0.不写显式的构造器---不可行,编译器会自动提供一个公有的,无参的缺省的构造器
1.抽象类的方式---不可行
子类可以继承父类,从而实例化
public abstract class Parent {
 
public Parent() {
}
 
public static void main(String[] args){
 
// Parent one = new Parent();
}
}
 
public class Child extends Parent {
 
public Child() {
}
 
}
 
 
2.使用私有构造器----可行,需要在构造器中添加限制
在使用私有构造器的基础下,再在构造方法中返回一个异常,因为虽然外部类无法实例化该类,但是内部类可以实例化该类;另外,通过反射的方式,还是可以实例化该类:通过反射的方式来实例化Elvis类(Elvis类有私有构造器)
  1.         Class<?> classType = Elvis.class;  
  2.         Constructor<?> c = classType.getDeclaredConstructor(null);  
  3.         c.setAccessible(true);  
  4.         Elvis e1 = (Elvis)c.newInstance();  
 
 
public class Elvis{
 
     private Elvis(){
         throw new AssertionError();
     }
...
}
 
 
引用:
 
 
 

以上是关于如何让一个类不能被实例化的主要内容,如果未能解决你的问题,请参考以下文章

设计一个类,让它始终只能实例化一个对象。

PHP能在类中实例化一个类吗

23种设计模式

c#中接口可不可以被实例化?

(JAVA)啥是实例化如何实现类的实例化(用类或方法创建一个该类的实例)?

如何判断java的一个类能否继承另一个类? 还有在new实例化一个对象时候有啥限制,