2016-11-01 4 views
0

다른 언어로 Java를 사용하고 있습니다. 분명한 점은 용서해주세요.하지만 아주 이상한 동작이 발생했습니다.Java Singleton 가끔 NullPointerException이 발생합니다.

저는 간단한 돼지 UDF를 작성하고 있습니다. TupleFactory 싱글 톤을 사용하여 생성하는 Tuple 객체를 반환하고 있습니다. 다음 두 코드 예제에서는 첫 번째 예제가 작동하지만 두 번째 코드 예제에서는 newTuple을 만들 때 NullPointerException이 발생합니다.

public class MyUDF { 

    public Tuple func(Tuple input) { 
     return TupleFactory.getInstance().newTuple(Arrays.asList(o1, o2, o3)); 
    } 
} 

public class MyUDF { 
    ... 
    TupleFactory _factory; 

    public Tuple func(Tuple input) { 
     _factory.getInstance(); 
     return _factory.newTuple(Arrays.asList(o1, o2, o3)); 
    } 
} 
+0

_factory.getInstance()에서 작동중인 bcz가 _factory 인스턴스에 다시 할당되지 않은 새 인스턴스를 반환 함 – mhasan

답변

1

첫 번째 코드 TupleFactory.getInstance()는 클래스 자체에 정적 클래스 메소드를 호출한다. _factory.getInstance()는 인스턴스 변수, 정의되어 있지만 아직 인스턴스화되지 않는 클래스 멤버 촉구 인스턴스

두 번째 코드없이 인스턴스 메서드를 호출

. 존재하지 않는 개체에서 개체 메서드를 호출 할 수 없습니다. 싱글

마지막으로, 자바 싱글 톤 패턴을 구현하는 가장 안전한 간단한 방법으로

Enum는 열거하는 것입니다. 검색 스택 오버플로 및/또는 다음과 같은 단어에 대한 검색 엔진 : Java singleton enum Joshua Bloch "Effective Java".

public enum TupleFactory { 
    INSTANCE; 

    // Add private constructor if needed. 

    public Tuple makeTuple(…) { 
     … 
     return tuple ; 
    } 

} 

이 사용법은 간단합니다. 싱글

마지막으로 오용의

Tuple t = TupleFactory.INSTANCE.makeTuple(…) ; 

주의, 나는 의무적주의에 대한 싱글 종종 "코드 냄새"인 개체에 대한 이해의 부족으로 인한 빈약 한 디자인의 증상을 추가 할 것 - 독점 프로그래밍.

0

당신은 _factory.getInstance()를 저장할 수있다; 먼저 을 으로 출력하십시오. Tupleinstanceclass obj = _factory.getInstance(); return obj.newTuple (Arrays.asList (o1, o2, o3));

0

난 당신이 코드의 첫 번째 부분에서

public class MyUDF { 
... 
TupleFactory _factory; 

public Tuple func(Tuple input) { 
    _factory = TupleFactory.getInstance(); 
    return _factory.newTuple(Arrays.asList(o1, o2, o3)); 
} 
} 
0

로 변경해야한다고 생각, 나는 getInstance() 방법은 static 것을 추론 할 수있다. static 메서드에 대해주의해야 할 중요한 점은 클래스 개체를 사용하여 액세스하지 말아야한다는 것입니다. 클래스 메소드이기 때문에 클래스 이름을 사용하여 액세스해야합니다.

singletons를 사용의 기본 개념은 처음 클래스의 객체가없는 상태에서 클래스 메소드 (하지 인스턴스 메서드) 그 클래스의 객체를 얻을를 호출하고 있다는 점이다. 이제 코드의 첫 번째 부분은 그것을 정당화하지만 코드의 두 번째 부분에서는 이미 _factory 객체를 가지고 있습니다. 따라서 getInstance()을 호출하여 클래스의 객체를 얻습니다.

또한이 라인의 _factory.getInstance()에서 _factory은 방금 선언되었지만 초기화되지 않았으며, 이것이 NullPointerException이되는 이유입니다.

또한 참조 :

  1. What is the difference between class and instance methods?
  2. Java: when to use static methods

다음 코드는 작동합니다. 싱글 톤 패턴 구현을 위해 예상 할 수로

public class MyUDF { 
    TupleFactory _factory; 

    public Tuple func(Tuple input) { 
     _factory = TupleFactory.getInstance(); 
     return _factory.newTuple(Arrays.asList(o1, o2, o3)); 
    } 
} 
+0

"클래스 객체를 사용하여 액세스 할 수 없습니다."라는 진술은 " 클래스 객체 " – mhasan

+0

@mhasan 그것을 지적 해 주셔서 감사합니다. –

관련 문제