[英]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.