2017年7月3日月曜日

Javaにおける、フィールド修飾子 (final や transient 等) の記述順序について

結論

文法上は自由だが、慣習としては下記の順序で記述する。(推奨)

  1. アクセス修飾子 (publicprotectedprivate、もしくは、何も書かない)
  2. static
  3. final
  4. transient
  5. volatile

根拠

  • Java 言語仕様」の「8.3.1. Field Modifiers」に、下記の記述あり。

    If two or more (distinct) field modifiers appear in a field declaration, it is customary, though not required, that they appear in the order consistent with that shown above in the production for FieldModifier.

    (日本語訳) フィールド宣言中にフィールド修飾子を複数記述する場合、必須ではないものの、慣習としては 上記の FieldModifier 生成規則に記述された順序で指定する。

  • java.lang.reflect.Modifier」の「toString(int mod)」に、下記の記述あり。

    修飾子名は、『Java(tm)言語仕様』のセクション8.1.1、8.3.1、8.4.3、8.8.3、および9.1.1で指定されている推奨修飾子順序に適合する順序で返されます。

補足

final」と「transient」の組み合わせは、ほとんどの場合でナンセンス。
transient」だとデシリアライズ時に null になるが、「final」ならば再代入ができない。
(当該フィールドの値は、デシリアライズ後は 常にnull になる)

例外として、シングルトンなどで、デシリアライズ時に readResolve() でインスタンス自体を読み替えてしまう場合だけは、「final transient」が意味を成す。

0 件のコメント :

コメントを投稿