단일 모델 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
    }
}

좋은 웹페이지 즐겨찾기