簡體   English   中英

在Java中從靜態成員調用非靜態方法

[英]Calling non-static method from static member in 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關鍵字。 這是一個例子:

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 */
}

不幸! SimpleDateFormat不是trread-safe:它保持內部狀態,並在同一時間出現混亂。

這會“解決”您的問題,因為您必須更改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中使用其他更好的類,這個問題就解決了。

順便說一下,yyyy-MM-dd是ISO標准。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM