2014-06-07 2 views
2

이 질문은 다소 복잡하며 검색 상자에 문제를 문구로 표시하는 방법을 모르기 때문에 이전에 질문을 받았는지 알 수 없습니다.Java의 정적 멤버에서 비 정적 메서드 호출

여기에 코드입니다 :

public class SomeClass 
{ 
    private static final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 

    public static String toUTCDateString(Date date) 
    { 
    df.setTimeZone(java.util.TimeZone.getTimeZone("UTC")); 
    return df.format(date); 
    } 

    /* more static methods */ 
} 

정적 멤버 df 더 정적 메서드에 다시 재사용 할 것이다, 그러나 나는 그것의 시간대가 처음 "UTC"로 설정되어 있어야합니다. .setTimeZone("UTC") 번으로 전화하는 방법이 있습니까? 또는 각 정적 방법으로 .setTimeZone("UTC")으로 전화해야합니까? Static Initialization Blocks

정적 초기화 블록

+2

'SimpleDateFormat'은 스레드로부터 안전하지 않습니다. 복수의 thread가 같은 static'SimpleDateFormat' 오브젝트를 동시에 사용하면 (자), 예기치 않은 결과가 발생합니다. –

+0

팁 주셔서 감사합니다. 정식 주목! – kerafill

답변

7

사용은 중괄호로 묶인 코드의 정상적인 블록, {}, 그리고 정적 키워드 앞에. 다음은 예입니다 : 클래스는 정적 초기화 블록의 수에는 제한이 없습니다

static { 
    // whatever code is needed for initialization goes here 
} 

, 그들은 어디 클래스 본문에 나타날 수 있습니다. 런타임 시스템은 정적 초기화 블록이 소스 코드에 나타나는 순서대로 호출되도록 보장합니다.

샘플 코드 : 불행하게도

public class SomeClass 
{ 
     private static final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 

     //Static Initialization Blocks 
     static{ 
      df.setTimeZone(java.util.TimeZone.getTimeZone("UTC")); 
     } 

     public static String toUTCDateString(Date date) 
     {  
      return df.format(date); 
     } 

    /* more static methods */ 
} 
+0

와우, 그게 간단하니? Java에서 정적 초기화 블록을 전혀 알지 못했습니다. > _ <;; – kerafill

+0

좋은 소리. 링크를 따라 자세히 읽어보십시오. – Braj

+1

예, 링크를 읽었습니다. 또는 개인 정적 initialize-methods를 사용하여 정적 멤버를 초기화 할 수도 있습니다. 감사! 5 분이 지나면 대답을 수락합니다! – kerafill

3

! SimpleDateFormat는 트레드에 안전하지 않습니다. 즉, 내부 상태를 유지하면서 동시에 혼란이 발생합니다.

이렇게하면 API를 변경해야하므로 문제가 "해결"됩니다.

public static DateFormat df() 
{ 
    DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
    df.setTimeZone(java.util.TimeZone.getTimeZone("UTC")); 
    return df; 
} 

Java 8에서는 다른 클래스를 사용하여이 문제를 해결했습니다.

By yyyy-MM-dd는 ISO 표준입니다.

관련 문제