倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

どんとこいタイプ・アノテーション! IntelliJ IDE 独自のタイプ・アノテーション

最近、Java8 で導入されたタイプ・アノテーションを使う方法をあれこれ試してるんですが、コンパイラに機能を追加するだけあって、設定がちょっと面倒なことが多いですね。 タイプ・アノテーションを具体的に使う際によく挙げられている例に、変数に代入される値の null チェックをするというものがあるんですが、Java Tutorials ではこの機能を提供するライブラリとして Checker Framework について言及されています。

で、この Checker Framework を IntelliJ IDEA 上で使えるように設定を頑張ってたんですが、ちょっとその前に IntelliJ IDEA が独自に提供している null チェックのライブラリを試してみることにしました。 と言いつつ、提供されているアノテーションの使い方ではなく設定方法だけ書いてます。

参考

設定手順

設定手順は以下の通り。 結果を先に言うと、Project Structure でライブラリに IntelliJ IDEA が提供する annotations.jar を追加しましょう、ってだけです。 IntelliJ IDEA に慣れてない人のために(久し振りに)画像をキャプチャしてアップしてみました。 IDEA の Java プロジェクトは既に作成されているとします。 設定のスタートはメニューから:

[メニュー] File ▶ Project Structure...

後は以下の手順で:


f:id:waman:20140526081710p:plain
なってなければ「Project language level」を「8.0」に。
(上の「Project SDK」が「1.8」になってなければそちらも設定。)
f:id:waman:20110105151547p:plain
f:id:waman:20140526081718p:plain
Libraries に IDEA の組み込みアノテーションのための Jar ファイル (annotations.jar) を以下の手順で追加。
f:id:waman:20110105151547p:plain
f:id:waman:20140526081759p:plain
annotations.jar は《IntelliJ IDEAのインストール・ディレクトリ》/lib 下にあります。
f:id:waman:20110105151547p:plain
f:id:waman:20140526081803p:plain
f:id:waman:20110105151547p:plain
f:id:waman:20140526081808p:plain
ライブラリに annotations が追加されていることを確認。
(赤線引き忘れたけど、真ん中の列で確認すればいいかな。)
f:id:waman:20110105151547p:plain
f:id:waman:20140526081813p:plain
Project language level を変更していた場合はこのダイアログが表示されると思うので Yes を選択。

これで設定できたので、実際にタイプ・アノテーションを試してみましょう。

タイプ・アノテーションを試してみる

設定が出来たら、以下のような Java コードを書いてみましょう:

import org.jetbrains.annotations.NotNull;

public class Main {

    public static void main(String... args){
        @NotNull Object obj = null;
    }
}

Checker Framework の同様のアノテーション @NonNull と違って @NotNull なのに注意。 このとき、「null」の部分に警告のハイライト(?)がされ、マウスを乗せると以下のように警告メッセージが表示されるはずです:


f:id:waman:20140526081817p:plain

画像が小さくて見えないか・・・

'null' is assigned to a variable that is annotated with @NotNull less... (Ctrl+F1)

@NotNull が付けられている型の変数に null 値を代入してる旨のメッセージですね。

IntelliJ IDEA の設定ファイル

特に知っておく必要はないんですが、タイプ・アノテーションを有効にするために必要な設定が IntelliJ IDEA の設定ファイルにどのように記述されているのかをメモっておきます。 ちょっと、Checker Framework の設定の参考にするんで。 タイプ・アノテーションの設定は以下のファイルに反映されているようです(ディレクトリ・ベース):

$PROJECT_DIR$

  • .idea
    • annotations.xml
    • compiler.xml
  • checker-test.iml

.idea/libraries/annotations.xml
annotations.jar へのパス設定:

<component name="libraryTable">
  <library name="annotations">
    <CLASSES>
      <root url="jar://$APPLICATION_HOME_DIR$/lib/annotations.jar!/" />
    </CLASSES>
    <JAVADOC />
    <SOURCES />
  </library>
</component>

.idea/compiler.xml
コンパイラに対するアノテーション処理設定:

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <option name="DEFAULT_COMPILER" value="Javac" />
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
    </wildcardResourcePatterns>

    <!-- 以下がアノテーション処理設定 -->
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

checker-test.iml

<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />

    <!-- モジュールのライブラリ設定 -->
    <orderEntry type="library" name="annotations" level="project" />
  </component>
</module>

まぁ、以外と設定ファイルも内容見てどんな設定が書かれてるのか分かるもんだね。 とか言いつつ設定見逃してたりするかもしれないけど。

プロダクティブ・プログラマ -プログラマのための生産性向上術 (THEORY/IN/PRACTICE)

プロダクティブ・プログラマ -プログラマのための生産性向上術 (THEORY/IN/PRACTICE)