🎯

【Java】クラス解説42・アノテーション

2024/08/03に公開

アノテーション

アノテーションとは、コード中に「」を付けてメタデータを付加することを言います。
アノテーションを利用することで、コンパイラが通常では検出できないエラーやバグを探知したり、特定の警告を抑制したりできます。
また、アノテーションを使用することで、コードの可読性が高まり、そして、保守性や拡張性を高めることができます。

全てのアノテーションを紹介はできませんが、下記でいくつかのアノテーションを解説します。


@Override

オーバーライドに失敗しているがエラーを出さないコード例

public class Main {
    public static void main(String... args) {
        Fuzi sk = new Sakura();
        sk.print();
    }
}

class Fuzi {
    void print() {
        System.out.println("フジ");
	}
}

class Sakura extends Fuzi {
    void prnt() { //メソッド名の綴り誤り 〇:print ×:prnt 
        System.out.println("サクラ");
	}
}

上記のコードは、アップキャストを行い、オーバーライドされたSakuraクラスのprintメソッドを呼び出そうとしていますが、綴りの誤りがあるため、Fuziクラスのprintメソッドが呼び出されてしまい、出力結果がフジとなってしまいます。
この時、本人としては、エラーが出ていないうえに、出力結果が間違っているものの出力自体は行われているため、オーバーライドの失敗には気付きにくい状態です。

これをアノテーションを使って解決したいと思います。

アノテーションを使って、オーバーライドの失敗のエラーを出すコード例

public class Main {
    public static void main(String... args) {
        Fuzi sk = new Sakura();
        sk.print();
    }
}

class Fuzi {
    void print() {
        System.out.println("フジ");
    }
}

class Sakura extends Fuzi {
    // アノテーション
    @Override
    void prnt() { //メソッド名の綴り誤り
        System.out.println("サクラ");
    }
}

上記のようにアノテーションを使用することで、下記のエラーが発生します。

Main.java:15: error: method does not override or implement a method from a supertype
	@Override
	^
1 error

このエラーは、@Overrideアノテーションを付けたメソッドが、スーパークラスのメソッドをオーバーライドしていない場合に発生します。
(今回は、綴り誤りによりオーバーライドできていないためです。)

アノテーションを使った正しいオーバーライドのコード例

public class Main {
    public static void main(String... args) {
        Fuzi sk = new Sakura();
        sk.print();
    }
}

class Fuzi {
    void print() {
        System.out.println("フジ");
    }
}

class Sakura extends Fuzi {
    @Override
    void print() {
        System.out.println("サクラ");
    }
}

アノテーションがあることで、オーバーライドしていることが一目でわかり、コードの可読性が高まっているのが分かると思います。


@Deprecated

このアノテーションが付加されたメソッドやクラスは、非推奨であることをコンパイラに伝えるものです。下記のコードでは、printメソッドが非推奨となっています。

public class Main {
    public static void main(String... args) {
        Fuzi fz = new Fuzi();
        fz.print();
    }
}

class Fuzi {
    @Deprecated
    void print() {
        System.out.println("フジ");
    }
}

このアノテーションを使用すると、下記ようなコンパイラの警告メッセージが表示される場合があります。

Note: Main.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

@SuppressWarnings

このアノテーションは、コンパイラの警告を抑制するために使用されます。例えば、未使用の変数や型の安全性に関する警告を無視したい場合に便利です。ただし、濫用しないよう注意が必要です。

public class Main {
    public static void main(String[] args) {
        Fuzi fz = new Fuzi();
        fz.print();
    }
}

class Fuzi {
    public void print() {
        // 未使用の変数
        int num = 24;
        System.out.println("フジ");
    } 
}

上記のコードだと、変数numが未使用となっており、未使用の変数がある旨の警告メッセージが出る場合があります。
しかし、下記のように@SuppressWarnings("unused")付加することにより、警告を抑制することができます。

public class Main {
    public static void main(String[] args) {
        Fuzi fz = new Fuzi();
        fz.print();
    }
}

class Fuzi {
    @SuppressWarnings("unused")
    public void print() {
        int num = 24;
        System.out.println("フジ");
    } 
}

このように、アノテーションを使用することで、コンパイラの警告を管理し、コードの品質を向上させることができます。


Discussion