マニュアル: Java

投稿日: 更新日:

ドキュメント

公式

公式以外

コーディング規約

よく忘れるクラス

個人的なガイドライン

  • クラスはfinalにしているか?
  • 中身を返すだけのgetterを定義していないか?
  • プリミティブ型を使っていないか?(特にString)

コレクション

Collections Framework

以下作成中。。。

  • Collection: 基底インタフェース
    • List: 順序付き
    • Set: 重複要素がない
    • Queue: いわゆるキュー。
      • Deque: 両端から追加削除できるキュー

拡張for

Java SE 5から導入された拡張for文は、以下のインタフェースを実装することで、 自前でも実装可能です。

別記事にしました。

文字コード

厳密にエラーをチェックしたい場合

例えばjava.io.InputStreamReaderでは、 デフォルトでは不正な入力があった場合、置換文字に置き換えられます。 厳密にエラーをチェックしたい場合は、 Charset#newDecoder() メソッドを使って、 デフォルトのデコーダを使うようにすると良いです。

データベース

オフラインのResultSetとしてCachedRowSetを使う方法 - seraphyの日記

時刻

java.time

  • JavaのDate and Time APIの設計思想が面白い - Qiita
  • パッケージ
    • java.time
    • java.time.chrono
      • 暦をあらわすもの
      • chronoという単語は普段は目にしませんが、「クロノ・トリガー」で連想するといいです。
      • JDK 8
    • java.time.format
      • 日付の出力と解析
      • JDK 8
    • java.time.temporal
      • 日時の一部分をアクセスするために使うもの。
      • 音楽とかの「テンポ」で連想すると良さそうです。
      • JDK 8
    • java.time.zone
      • タイムゾーン。
      • JDK 8
  • 基本クラス
    • java.time.LocalDateTime: ローカル時刻(タイムゾーンなし)
    • java.time.ZonedDateTime: タイムゾーンあり
    • java.time.OffsetDateTime: オフセット付き時刻
    • java.time.Instant: 時点
      • Unix時刻に近いものです。
      • JDK 8
      • toEpochMilli()を使うことでミリ秒で取得が可能ですが、ナノ秒の情報が失われることに注意。
  • よく使うもの
    • 日付の追加など: plusDays()とかを使用する。
    • 切り捨て: truncatedTo()を使用する。
      • 切り捨ての単位はTemporalUnitインタフェース。実装は以下の2箇所にある。
        • ChronoUnit
          • インタフェースを実装した列挙型
          • 通常はこっちでOK
        • IsoFields
          • 定数として定義されています。
    • 既存のクラスとの相互運用
      • Instant
        • Instant.now().toEpochMilli()System.currentTimeMillis()は同じです。
      • java.sql.Timestamp
        • JDK 8
        • toInstant()from(Instant instant)メソッドが定義されています。

よく使うパターン

書式はDateTimeFormatterに書かれています。

形式 メソッド
YYYY-MM-DD 2018-01-27 LocalDate.parse(str)
YYYYMMDD 20180127 LocalDate.parse(str, DateTimeFormatter.BASIC_ISO_DATE)
YYYY-MM-DD hh:mm:ss 2018-01-27 21:09:19 LocalDateTime.parse("2018-01-27 21:01:54", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")

フォーマッターを自前で構築する場合

yyyy-MM-dd HH:mm:ssに相当するフォーマッターはこんな感じです。 (エラーも含めて厳密に正しいかどうかは自信ありません)

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .append(DateTimeFormatter.ISO_LOCAL_DATE)
    .appendLiteral(' ')
    .append(DateTimeFormatter.ISO_LOCAL_TIME)
    .toFormatter();

ファイルパス

よく使うメソッド

  • Pathの作成
    • Paths#get(String first, String... more)
    • デフォルトのFileSystemのメソッドを呼び出します。
  • ファイル操作: Filesのstaticメソッドを呼び出すとよいです。

プリミティブ型

Chapter 4. Types, Values, and Variables

ボクシング

Chapter 5. Conversions and Contexts

new IntegerよりInteger.valueOf()を使う

Boxing Conversion、またはInteger#valueOf()の定義より、 -128から127の値はa == bとなります。 これは、よく使われる値は、Flyweightパターンを使用してオブジェクトを共有しているためです。

new Integerでは常に新規オブジェクトが割り当てられてしまうため、 Integer.valueOf()を使うことが望ましいです。

これは他のボクシング型や、BigDecimalも該当します。

プロセス起動

互換性

例えばクラスとインタフェースは互換性がありません。 詳細はJavaのクラスとインタフェースはバイナリ互換性がない参照。

keytool

keytool

証明書ファイルの場所は、java.home1の下の jre/lib/security/cacerts になります。

  • キーストアの中身のリスト: keystore -keystore key.jks -list
  • キーストア・エントリの表示: keystore -keystore key.jks -list -alias keystore_alias

  1. OpenJDKだと最終的に /usr/lib/jvm/java-* みたいです。 [return]

公式サイト

外部サイト

逆引きマニュアル