匿名クラスを対策する
匿名クラスとは、クラス名を指定せずに、クラス定義とインスタンス化を一つの指揮として記述したクラスのことを指す。主なルールとしては下記の通りで、ほとんどローカルクラスと同じとなっている。ルール③とルール⑥については、明確にローカルクラスとの差分であるため注意しておきたい。
項番 | ルール |
---|---|
1 | アクセス修飾子を利用できない |
2 | stract修飾子を利用できない |
3 | abstract修飾子、final修飾子を利用できない |
4 | 外側のクラスのメンバを利用できる |
5 | 外側のクラスのメソッドの引数およびローカル変数にアクセスするには、各変数がfinalでなければならない |
6 | コンストラクタを定義できない |
interface myInter { void methodA(); } class outer { // 外側のクラス public void method(){ // 匿名クラス new myInter() { public void methodA() { System.out.println("匿名クラスです"); } }.methodA(); } }
ルール③abstract修飾子、final修飾子を利用できない
ローカルクラスでは、他のクラスと同様にabstract修飾子、final修飾子を利用できた。しかし、匿名クラスはクラス名を指定しないという特性上、抽象化して別で再定義、継承することはできず、final修飾子を付けて継承禁止を明文化することもできない。 また、下記のコードを見て貰えば分かる通り、クラスを生成しているというよりは、定義と同時にインスタンスを生成しているという方が正しいように思う。生成したインスタンスにfinalを付与するというのは、よく考えると意味が分からない。
interface myInter { void methodA(); } class outer { // 外側のクラス public void method(){ // 匿名クラス myInter obj = new myInter() { public void methodA() { System.out.println("匿名クラスです"); } } obj .methodA(); } }
ルール③abstract修飾子、final修飾子を利用できない
定義と同時にインスタンスを生成している匿名クラスでは、コンストラクタを定義することができない。そもそもコンストラクタとはインスタンス生成時に呼ばれる処理を指すのだから、インスタンス生成しようとした時に、コンストラクタを定義しようする処理をコンパイルで弾いていると考えると覚えやすい。
まとめ
とりあえず座学でルール的な部分は理解できた。ただルールを知識として詰め込むのではなく、理屈的な部分も自分が納得のいく形で覚えるように心がけているため、記事にもそういった納得のいく理屈部分をまとめるように心がけている。今回の匿名クラスの記事では、ローカルクラスの内容を踏まえていることや、Java Silverの知識があることを前提としていたりする。初心者には優しくない記事なってしまったと反省しつつ、今後の連載では改善していければと思う。 とりあえず1週目の学習はここまで。次週もよろしく頼みます。