java如何保证获取一个类对象时,获取的是同一个对象
程序员文章站
2022-06-02 15:46:44
...
如何保证获取一个类对象时,获取的是同一个对象
一般我们获取一个类对象的时候一般会使用new关键字,也就是调用这个类的无参构造器,这样我们就会得到这个类的多个对象。
但是我们现在需要的是只要我们使用这个类获取的就是同一个对象,所以我们在编写这个类的无参构造器时就要使用private修饰。
//饿汉模式
//不管用不用 先创建对象 占用资源 线程安全
public class SingleClass {
private static SingleClass t = new SingleClass();
private SingleClass() {
}
public static SingleClass setB() {
return t;
}
}
测试一下
public class SingleTest {
public static void main(String[] args) {
singleClass s = singleClass.setB();
singleClass s1 = singleClass.setB();
System.out.println("第一个对象:"+s);
System.out.println("第二个对象:"+s1);
}
}
结果:
还有一种方式
//懒汉模式
//需要才创建对象 线程不安全
public class singleClass1 {
private static singleClass1 t;
private singleClass1() {
}
public static singleClass1 setA() {
if(t==null) {
t = new singleClass1();
}
return t;
}
}
测试一下
public class SingleTest {
public static void main(String[] args) {
singleClass1 s = singleClass1.setA();
singleClass1 s1 = singleClass1.setA();
System.out.println("第一个对象:"+s);
System.out.println("第二个对象:"+s1);
}
}
结果:
这两种方式在java里被称为饿汉模式和懒汉模式
再说一个题外话,如果我就想获取这个类的不同对象咋办。
这里我们就要用到反射了。
这里只写一个饿汉模式的反射
import java.lang.reflect.Constructor;
public class SungleClassFan {
public static void main(String[] args) {
Class<singleClass> c = singleClass.class;
System.out.println(c.getName());
try {
Constructor<singleClass> con=c.getDeclaredConstructor();
con.setAccessible(true);
singleClass single = (singleClass)con.newInstance();
System.out.println(singleClass.setB());
System.out.println("无参私有构造方法:"+single);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果: