Previous | Next | Trail Map | Writing Java Programs | オブジェクト、クラス、インタフェース


Final クラスとメソッドの書き方

final クラス

Java ではクラスが final であると宣言することができる。すなわち、クラスはサブクラス化されない。 これを行う(少なくとも)2つの理由は、セキュリティ問題と設計上の問題である。

セキュリティ:ハッカーがシステムをくつがえすために使用する1つのメカニズムとしては、クラスのサブクラスを作成して、それらのクラスをオリジナルの代わりに置換する。 サブクラスは見た目には、オリジナルのクラスのように思われる。しかし破損を起こしたり、あるいは非公開の情報を入手して、非常に異なるものになる。 この種の破壊活動を防止するために、クラスは final であると宣言して、どんなサブクラスでも作成されるのを阻止することができる。 java.lang パッケージの String クラスはこの理由のために final クラスとなっている。 他の文字列ではなく、正確に java.lang.String を得たString をメソッドあるいはオブジェクトが使用する時はいつでも、Java システムが保証しなくてはならないコンパイラとインタプリタの操作にとっては、String クラスは極めて重要である。 これにより、すべての文字列が妙な、矛盾した、望ましくない、あるいは予想できない設定項目を持っていないということが保証される。

final クラスのサブクラスをコンパイルしようとするなら、コンパイラはエラーメッセージをプリントして、プログラムをコンパイルすることを拒否する。 さらに、バイトコード検査機構により、クラスが final クラスのサブクラスではないことを明確にするチェックを行い、破壊活動がバイトコードレベルにおいて起きていないことを保証する。

設計: クラスを final と宣言するもう1つのは、オブジェクト指向の設計理由のためである。 クラスが「完ぺきである」、あるいは、概念的にクラスがサブクラスを持つべきではないと思うかも知れない。

クラスが final クラスであることを明示するためには、クラス宣言で class キーワードの前に final キーワード を使用する。 例えば、完ぺきな) ChessAlgorithm クラスを final であると宣言する場合、その宣言は次のようになる。

final class ChessAlgorithm {
    . . .
}

ChessAlgorithm をサブクラスに入れるためにどんな試みを行っても、次のようなコンパイラエラーをもたらすであろう。。

Chess.java:6: Can't subclass final classes: class ChessAlgorithm
class BetterChessAlgorithm extends ChessAlgorithm {
      ^
1 error

final メソッド

final クラスを作成するのは必要以上に思えるが、単にクラスメソッドの幾つかをオーバライドか保護したい場合には、メソッド宣言に final キーワードを使用することができる。final キーワードの使用により、メソッドがサブクラスによりオーバライドされないことをコンパイラに表示することができる。

メソッドが変更されるべきでない実装を持ち、オブジェクトの一貫した状態が重要であるなら、メソッド final を作るほうが良いかもしれない。例えば、 ChessAlgorithm クラスを final にする代わりに、 nextMove() メソッドを final にしてみる。

class ChessAlgorithm {
    . . .
    final void nextMove(ChessPiece pieceMoved, BoardLocation newLocation) {
    }
    . . .
}


Previous | Next | Trail Map | Writing Java Programs | オブジェクト、クラス、インタフェース