在Java中从静态成员调用非静态方法

时间:2014-06-07 08:28:29

标签: 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")

2 个答案:

答案 0 :(得分:7)

使用Static Initialization Blocks

静态初始化块是用大括号{}括起来的常规代码块,前面是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 */
}

答案 1 :(得分:3)

可惜! 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标准。