2010-12-31 3 views
2

테이블로 사용하는 클래스가 있습니다. 이 클래스에는 16 개의 행 클래스 배열이 있습니다. 이 행 클래스에는 모두 6 개의 이중 변수가 있습니다. 이러한 행의 값은 한 번 설정되며 절대로 변경되지 않습니다.싱글 톤으로 테이블 클래스 만들기

이 테이블을 싱글 톤으로 만드는 것이 좋습니까? 이점은 메모리 비용이 적게 듭니다.하지만 테이블이 여러 스레드에서 호출되므로 코드를 동기화해야만 조금 더 느린 응용 프로그램이 발생합니다. 그러나이 테이블의 조회는 아마도 실행되는 전체 코드의 아주 작은 부분 일 것입니다.

편집 : 이것이 내 코드입니다. 더 좋은 방법이 있습니까? 아니면 좋은 연습입니까? 이 질문의 권장 사항에 따라 동기화 된 키워드가 제거되었습니다. 이러한 행의

final class HalfTimeTable { 
    private HalfTimeRow[] table = new HalfTimeRow[16]; 
    private static final HalfTimeTable instance = new HalfTimeTable(); 

    private HalfTimeTable() { 
     if (instance != null) { 
      throw new IllegalStateException("Already instantiated"); 
     } 
     table[0] = new HalfTimeRow(4.0, 1.2599, 0.5050, 1.5, 1.7435, 0.1911); 
     table[1] = new HalfTimeRow(8.0, 1.0000, 0.6514, 3.0, 1.3838, 0.4295); 
     //etc 
    } 

    @Override 
    @Deprecated 
    public Object clone() throws CloneNotSupportedException { 
     throw new CloneNotSupportedException(); 
    } 

    public static HalfTimeTable getInstance() { 
     return instance; 
    } 

    public HalfTimeRow getRow(int rownumber) { 
     return table[rownumber]; 
    } 
} 
+0

다소 주제를 벗어나지 만 클래스가 명시 적으로 'Cloneable'인터페이스를 구현하지 않는 한'clone'을 무시하지 않아도됩니다. 또한,'getInstance'는 아마도 정적이어야합니다 :) –

+0

나는 복제에 대해 몰랐습니다. 싱글 톤의 복제를 피하기 위해 그것을 덮어 써야한다는 어딘가를 읽었다. 내 getInstance 물론 정적입니다. 우연히 질문에서 그것을 제거했습니다. 정보는 –

답변

3

그것은 당신의 클래스를 사용하는 것입니다 방법에 달려을 동기화 할 이유가 없다. 언제든지 정확히 한 인스턴스 (JVM 당)를 원한다고 확신하는 경우에만 싱글 톤으로 만들고 싶을 것입니다.

코드가하는 일에 대한 자세한 내용을 모른 채 결정적인 대답을 내리는 것은 불가능합니다.

두 개의 서로 다른 테이블을 원하십니까? 테이블의 데이터는 절대로 변경되지 않지만 다른 데이터를 포함하는 두 개의 테이블을 만들 것이라고 말하십니까? 그렇다면 싱글 톤이 적합하지 않습니다. 단 하나의 인스턴스 만 원한다면 싱글 톤이 좋다.

+0

모든 데이터가 동일하게 유지되지는 않습니다. 계산에 사용할 값에 대한 순수 조회 테이블입니다. 값은 예를 들어'sizeOfEarth = 16000km'와 비교 될 수 있습니다. 그것은 사실이며 토론은 불가능합니다.). –

+0

@ 마크 : 확실히 싱글 톤에 가야합니다. –

2

값은 한 번 설정하고 변경되지 않습니다.

예 싱글 톤은이 경우 좋은 생각이지만 읽기 전용이지만 왜 동기화합니까?

1

클라이언트간에 개체를 공유하기 위해 싱글 톤 패턴을 구현할 필요가 없습니다. 한 번 생성하여 다른 객체에 전달할 수 있습니다.

The values of these rows are set once and never change을 사용하면 테이블 및 해당 값이 클라이언트에서 사용되기 전에 완전히 구성되었다는 것을 의미하므로 정보에 대한 읽기 전용 액세스 권한이 있습니다. 이는 동기화가 필요 없음을 의미합니다. org.live.java으로

+0

Tnx를 참조하십시오. 여러 스레드로 동일한 메모리 블록을 읽는 것이 문제를 일으키는 지 확실하지 않았습니다. –

0

말했다 - 당신이 예를 들어 생성자에서 테이블을 초기화하는 경우 (게으른 NOT) 다음

관련 문제