单例,枚举,反射,序列化--effectiveJava读书笔记

先看一个单例:

public class Singleton{
	private final static Singleton INSTANCE  = new Singleton();
	private Singleton(){};
	public static Singleton getInstance(){return INSTANCE;}
}

我们用序列化来打破单例

public class Singleton implements Serializable{
	private final static Singleton INSTANCE  = new Singleton();
	private Singleton(){};
	public static Singleton getInstance(){return INSTANCE;}
	
	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		Singleton s1 = Singleton.getInstance();
		File objectF = new File("/object");
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(objectF));
		out.writeObject(s1);
		out.close();
		ObjectInputStream in = new ObjectInputStream(new FileInputStream(objectF));
		Singleton s2 = (Singleton) in.readObject();
		in.close();
		System.out.println("是单例么?" + (s1 == s2));
	}
}

将会打印:

是单例么?false。

可见我们可以这样破坏其单例属性。要保持应该怎么办呢?需要增加readResolve方法,Java反序列化的时候会用这个方法的返回值直接代替序列化得到的对象

public class Singleton implements Serializable{
	private final static Singleton INSTANCE  = new Singleton();
	private Singleton(){};
	public static Singleton getInstance(){return INSTANCE;}
		
	private Object readResolve() {
		return INSTANCE;
	}
	
	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		Singleton s1 = Singleton.getInstance();
		File objectF = new File("/object");
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(objectF));
		out.writeObject(s1);
		out.close();
		ObjectInputStream in = new ObjectInputStream(new FileInputStream(objectF));
		Singleton s2 = (Singleton) in.readObject();
		in.close();
		System.out.println("是单例么?" + (s1 == s2));
	}
}
打印:

是单例么?true


我们再通过反射来打破其的单例性:

public class Singleton{
	private final static Singleton INSTANCE  = new Singleton();
	private Singleton(){};
	public static Singleton getInstance(){return INSTANCE;}
	
	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
		Singleton s1 = Singleton.getInstance();
		Constructor<Singleton> c = Singleton.class.getDeclaredConstructor();
		c.setAccessible(true);
		Singleton s2 = c.newInstance();
		System.out.println("是单例么?" + (s1 == s2));
	}
}

将会打印:

是单例么?false。

说明使用反射调用私有构造器也是可以破坏单例的,解决的办法是如下:

public class Singleton{
	private final static Singleton INSTANCE  = new Singleton();
	private Singleton(){
		if(++COUNT > 1){
			throw new RuntimeException("can not be construt more than once");
		}
	};
	private static int COUNT = 0;
	public static Singleton getInstance(){
		return INSTANCE;
	}
}

这样当使用反射调用的时候,就会抛出异常。

再用clone来破坏单例性

public class Singleton implements Cloneable{
	private final static Singleton INSTANCE  = new Singleton();
	public static Singleton getInstance(){
		return INSTANCE;
	}
	
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = (Singleton) s1.clone();
		System.out.println("是单例么?" + (s1 == s2));
	}
}

这样也会发现不是单例了,办法是重新clone方法。

public class Singleton implements Cloneable{
	private final static Singleton INSTANCE  = new Singleton();
	public static Singleton getInstance(){
		return INSTANCE;
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return INSTANCE;
	}
	
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = (Singleton) s1.clone();
		System.out.println("是单例么?" + (s1 == s2));
	}
}

如果想要比较简便的避免上诉的问题,最好的方式是使用枚举:

public enum SingleEnum {
	INSTANCE;
	
	public static SingleEnum getInstance(){
		return INSTANCE;
	}
}

其通过反射会抛出如下异常:

 java.lang.NoSuchMethodException: com.price.effective.create.SingleEnum.<init>()

通过反序列化其也会返回INSTANCE对象。

其没有clone方法


综上,Enum可以作为想用单例时的第一选择。




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PMSM无感FOC控制是一种传统的控制方法,主要用于三相永磁同步电机控制。该控制方法采用双闭环控制结构,在速度环和电流环之间分别设置了PI控制器,使电机达到精准控制。这种控制方法使用空间向量调制技术,结合三相电流反馈和三相电压反馈,实现电机无感控制。 此外,PMSM无感FOC控制还使用了传统SVM技术,采用SVPWM波形,通过控制器的输出,使各相电流按照一定的规律变化,实现控制目标。 在标准FOC控制中,需要使用位置传感器来获取电机的位置信息,但PMSM无感FOC控制则使用基于传统的SVM技术来预测电机的位置信息。因此,不需要使用位置传感器即可实现对电机控制,大大降低了系统成本。 总的来说,PMSM无感FOC控制是一种成熟的控制方法,在永磁同步电机控制中得到了广泛应用。在实际应用中,需要考虑控制器的参数与电机参数的匹配,以及实时性和稳定性等问题。 ### 回答2: PMSM无感FOC无感控制技术)是一种高精度、高效率的电机控制技术,在工业控制领域中应用很广泛。相较于其他传统的电机控制技术,PMSM无感FOC具有以下优点: 首先,在控制效果方面,PMSM无感FOC可以实现高精度的转速控制和位置控制,具有响应速度快、控制精度高的特点。其次,在节能方面,由于无感FOC控制技术可以减小电机的逆磁电动势,并通过控制直流电流的大小和方向来控制电机运行状态,从而达到更好的节能效果。此外,PMSM无感FOC还具有抗干扰性强、控制性能稳定等优点。 对于传统SME控制过程中存在的一些问题,PMSM无感FOC采用了一种更加先进的控制方法。它主要是通过异步滤波器解决了转子位置和速度的估算问题。PMSM无感FOC还采用了PID控制算法,能够有效地改善系统的响应速度和控制精度。在实际使用过程中,PMSM无感FOC控制技术已经被广泛应用于家电、工业领域等多个方面,为工业应用提供了更加高效、稳定的电机控制方案。 ### 回答3: PMSM无感FOC控制是一种新型的电机控制方法,目前广泛应用于工业和家用电机系统中。传统的FOC控制方法需要使用霍尔传感器或编码器等硬件传感器来获取电机转子位置信息,但这些传感器会增加系统的复杂度和成本。相比之下,PMSM无感FOC控制方法通过算法来估算电机转子位置和速度,避免了传感器的使用,从而降低了系统的成本和故障率。 在PMSM无感FOC控制中,传统的滑模观测器(SME)已经不能满足要求,因为它对参数敏感,噪声容易干扰,不易消除不确定性,导致控制精度不高,反应缓慢。为了解决这些问题,研究人员开发了传统滑模观测器的改进版——新型滑模观测器(SMO)。这种观测器采用了自适应观测器方法来估算电机参数,同时利用滑动模式控制来消除不确定性,提高控制精度和鲁棒性。 另外,PMSM无感FOC控制还需要使用支持向量机(SVM)算法来实现空间矢量调制(SVM)控制。SVM是一种基于统计学习理论的分类算法,它能够将多维特征空间映射到高维特征空间,从而更好地进行分类。在PMSM无感FOC控制中,SVM算法用来确定电机的磁场方向和转子速度,从而实现调制控制。 总之,PMSM无感FOC控制方法是一种高效、可靠、成本低的电机控制方法,相比传统FOC控制方法具有更好的控制精度和鲁棒性。它需要使用新型滑模观测器和SVM算法来实现,可以广泛应用于各种电机系统中,具有极高的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值