단일 모델 3가지 실현
3983 단어 java 기초
아사자식
게으름뱅이
정적 내부 클래스
사유 구조 방법의 장점
단례 모델의 세 가지 실현 방식은 굶주림식, 게으름식과 정태 내부류의 실현이다.
아사자식
즉, 처음부터 단일 대상을 초기화합니다. 그러면 다음에 사용자가 대상을 가져오는 방법을 호출할 때 만들어진 대상 인용을 되돌려주면 됩니다.
장점은 사용자가 처음으로 예시 대상을 얻었을 때 시간을 절약할 수 있다는 것이다. 단점은 예시 대상이 만들어진 후 늦게 가져오지 않으면 메모리 공간을 차지할 수 있다는 것이다.
/**
* @author zkw
* @date 2020/7/5 8:30
*/
public class Singleton1 {
// obj
private Singleton1(){}
public static void main(String[] args) {
System.out.println(Singleton1.getInstance());
System.out.println(Singleton1.getInstance());
}
private static final Singleton1 obj = new Singleton1();
public static Singleton1 getInstance(){
return obj;
}
}
게으름뱅이
사용자가 대상을 가져오는 방법을 호출할 때, 예시 대상이 초기화되었는지, 초기화되었는지 확인하고, 대상의 인용을 직접 되돌려줍니다.게으른 getInstance () 는 동기화를 해야 합니다. 그렇지 않으면 라인 보안 문제가 발생할 수 있습니다.
장단점은 굶주린 사람식과 반대로 노선 안전 문제가 발생할 수 있다.
/**
* @author zkw
* @date 2020/7/5 8:50
*/
public class Singleton2 {
// obj
private Singleton2(){}
private static Singleton2 obj = null;
public static void main(String[] args) {
System.out.println(Singleton2.getInstance());
System.out.println(Singleton2.getInstance());
}
public static Singleton2 getInstance(){
if (obj == null){
synchronized (Singleton2.class){
if (obj == null){
obj = new Singleton2();
}
}
}
return obj;
}
}
정적 내부 클래스
게으름뱅이식 최적화 버전이자 사용자가 처음 얻었을 때 초기화했지만 개발자는 스스로 라인 안전 문제를 제어하지 않고 JVM에 맡겨 관리했다.
/**
* @author zkw
* @date 2020/7/5 8:58
*/
public class Singleton3 {
private Singleton3(){}
public static void main(String[] args) {
System.out.println(Singleton3.getInstance());
System.out.println(Singleton3.getInstance());
}
public static Singleton3 getInstance(){
return InnerSingleton3.obj;
}
private static class InnerSingleton3{
// obj
private InnerSingleton3(){}
private static final Singleton3 obj = new Singleton3();
}
}
사유 구조 방법의 장점
반사를 통해 단례 대상을 가져오고 수정하는 것을 방지할 수 있다.사유 구조 방법은 클래스 외부에서 new를 통해 클래스 대상을 만드는 것을 방지할 수 있고 반사에서 클래스 대상을 통과하는 newInstance () 방법도 클래스의 공참 구조기를 호출하여 대상을 만드는 것이기 때문에 반사 메커니즘이 단일 모드에 대한 파괴를 방지할 수 있다.Singleton 대상을 만들 수 없습니다. 파괴는 말할 수 없습니다.
/**
* Creates a new instance of the class represented by this {@code Class}
* object. The class is instantiated as if by a {@code new}
* expression with an empty argument list.
**/
@CallerSensitive
public T newInstance(){
......
}
반사 메커니즘을 통해 대상 중의 사유 속성 (인용) 을 얻을 수 있습니다. 아래obj는final로 수식되어 있으며,obj가 새로운 대상을 인용할 수 없지만,obj가 현재 가리키는 대상의 내부 속성을 수정할 수 있습니다.다음은 구성 방법이 모두 때때로 반사를 통해 단일 객체 참조를 얻을 수 있음을 증명하는 실험 코드입니다.
public class Singleton1 {
//
public Singleton1(){}
private static final Singleton1 obj = new Singleton1();
public static Singleton1 getInstance(){
return obj;
}
}
class Test{
public static void main(String[] args) throws Exception {
Singleton1 instance = new Singleton1();
Singleton1 instance1 = instance.getInstance(); //
System.out.println(instance1); // Singleton1@12a3a380
// “obj”
Class extends Singleton1> cla = instance.getClass();
Field field = cla.getDeclaredField("obj");
field.setAccessible(true); //
Singleton1 obj = (Singleton1)field.get(instance);
System.out.println(obj); // Singleton1@12a3a380
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 네트워크 프로그래밍의 UDP 서버 및 클라이언트 프로그램서버: 클라이언트: UDP: 클라이언트를 열어 데이터를 받을 때까지 기다린 다음 서버를 열어 데이터를 보냅니다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.