HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

java.util.Formatter クラス

なんか、どこかで見たような名前のクラスだが、それはたぶんjava.text.Formatクラス。
このクラスを直接使用することは今のところはあまりない。でもよく使っている。
どこで使っているかというと、例えば次のようなクラスのメソッド

  • java.io.PrintStream クラス
    • public PrintStream printf(String format, Object... args) メソッド
      • public PrintStream format(String format, Object... args) メソッドを呼ぶ
    • public PrintStream printf(Locale l, String format, Object... args) メソッド
      • public PrintStream format(Locale l, String format, Object... args) メソッドを呼ぶ
  • java.io.PrintWriter クラス
    • public PrintWriter printf(String format, Object... args) メソッド
      • public PrintWriter format(String format, Object... args) メソッドを呼ぶ
    • public PrintWriter printf(Locale l, String format, Object... args) メソッド
      • public PrintWriter format(Locale l, String format, Object... args) メソッドを呼ぶ
  • java.lang.String クラス
    • public static String format(String format, Object... args) メソッド
    • public static String format(Locale l, String format, Object... args) メソッド

また、java.util.Formatterクラスに関連する次のインタフェースもJava 2 SE 5.0から導入されている。

誰か(誰)が、これらのインタフェースを(instanceofなどで)判定することはないだろう、と言っていて、自分もそう思っていた。確かに判定はしないだろうが、実はこれらは全てjava.util.Formatterクラスで使用されている。

java.lang.Appendableインタフェースは、Formatterクラスのフィールドの型になっている。コンストラクタにAppendableオブジェクトを渡すものはそのままだが、ほかにもファイル名やFileオブジェクトを渡すものはそのファイルに書き込むためのBufferedWriter、何も渡さないものはStringBuilderオブジェクトがそのフィールドに保持される。
java.io.Closeableインタフェースは、Formatterクラス自身もこのインタフェースを実装しているが、そのclose()メソッドの中で、保持しているAppendableオブジェクトがCloseableインタフェースを実装している場合はそいつのclose()メソッドを呼ぶという処理をしている。
java.io.Flushableインタフェースは、Closeableインタフェースと同様にFormatterクラス自身が実装しているが、そのflush()メソッドの中で、保持しているAppendableオブジェクトがFlushableインタフェースを実装している場合はそいつのflush()メソッドを呼ぶという処理をしている。

独自のクラス自身が、このFormatterオブジェクトによる整形処理を必要とする場合(あるのか?)にはAppendableインタフェースを実装することになるが、その際に、Closeableインタフェース、Flushableインタフェースの実装の必要性についても考慮することになるのだろう。