Java入門22 final修飾子で変更禁止にする

Java入門の第22回です。前回からの続きですが、今回だけでも分かる内容になっています。このシリーズの第1回はこちらです。

今回は、final修飾子について解説します。変更を禁止する際に使用するfinal修飾子の使い方をマスターしましょう。

final修飾子は変更を禁止する際に使用する

final修飾子は、変更を禁止する際に使用する際に指定する修飾子です。クラスやメソッドや変数にfinalキーワードを付けると、それらを変更できなくなります。

「final クラス」と書けば、そのクラスを継承できなくなります。 「final メソッド」と書けば、 そのメソッドのオーバーライドができなくなります。 「final 変数」と書けば、 その変数への再代入ができなくなります。

final修飾子は、すでにコードとして完成されていて今後変更する必要のないクラスやメソッドの先頭や、将来的に変更が起こらない定数の先頭に記述して、不用意な変更が起きるのを防ぎます。

final修飾子を使用した実例

以下は、final修飾子を使用したコードの実例です。

class Item {
    public final String ITEMNAME = "納豆ねば~る君";
    public int price = 100;

    void printItem() {
        System.out.println("商品:" + this.ITEMNAME);
        System.out.println("価格:" + this.price);
    }
}

public class Test26 {
    public static void main(String[] args) {
        //インスタンスを生成
        Item i1 = new Item();

        //インスタンス変数に代入
        i1.price = 80;

        //インスタンスメソッドを実行
        i1.printItem();
    }
}

上記コードでは、商品名ITEMNAMEは今後も変更されないので、final修飾子を付けて定数としてます。一方、価格priceは100という値が代入されていますが、状況により価格が変更される可能性があるためfinal修飾子を付けていません。

定数の場合には ITEMNAME という具合にすべて大文字にしています。必ず大文字にしなくてはならないわけではありませんが、priceのように変更される可能性がある変数と、 ITEMNAME のように変更される可能性がない定数を区別しやすいように大文字と小文字を使い分けています。

上記コードの実行結果は、以下の通りです。

商品:納豆ねば~る君
価格:80

仮に i1.price = 80; の行が無い場合の実行結果は、以下の通りです。

商品:納豆ねば~る君
価格:100

final修飾子を指定したデータを変更しようとするとエラーになる

final修飾子を指定したデータを変更しようとすると、エラーになります。上記の例を一部変更して確認してみましょう。

class Item {
    public final String ITEMNAME = "納豆ねば~る君";
    public int price = 100;

    void printItem() {
        System.out.println("商品:" + this.ITEMNAME);
        System.out.println("価格:" + this.price);
    }
}

public class Test26 {
    public static void main(String[] args) {
        //インスタンスを生成
        Item i1 = new Item();

        //インスタンス変数に代入
        i1.ITEMNAME = "納豆ねば子ちゃん";  //★エラーになる
        i1.price = 80;

        //インスタンスメソッドを実行
        i1.printItem();
    }
}

上記コードでは、final修飾子を付けた定数 ITEMNAME に対して、インスタンス生成後に値を再代入しようとしています。値を再代入しようとしているのは、i1.ITEMNAME = “納豆ねば子ちゃん”; の部分です。商品名は将来的にも変更しないと決めたはずなのに変更しようとしています。

この再代入の指定は、もちろんエラーとなります。以下は、上記コードをEclipseで作成した場合の画面です。Eclipse画面には「final フィールド Item.ITEMNAME には代入できません」と警告が表示されています。

次回へ続きます。