在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不是线程安全的:它保持内部状态,并在出现混乱的同时使用。

这"解决"了你的问题,因为你必须更改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标准。

最新更新