2012-05-01 1 views
2

Core Java APIの多くのクラスはfinal(Wrapperクラス、String、Math)です。 なぜそうですか?なぜラッパークラス、文字列、...最終ですか?

+0

これらのパッケージを発明した人は誰でも尋ねてください。私の推測は、JDKがStringクラスとWrapperクラスで動作することが保証されているためです(動作を変更するサブクラスの問題を回避する)。 –

+0

拡張されることは意図されていないためですか? – assylias

+0

重複:http://stackoverflow.com/questions/2068804/why-is-string-final-in-java – Mat

答えて

1

他のプログラマーがサブクラスを作成したり、特定のメソッドをオーバーライドするのを防ぐことができます。このような場合は、の最後のというキーワードを使用します。

Stringクラスは、不変の不変であることを意味します。文字列オブジェクトは、それらのメソッドのいずれによっても変更できません。 javaはこれを強制しないので、クラスデザイナーはやりました。誰もStringのサブクラスを作成することはできません。

これはあなたの質問にお答えします。

+0

'final' *が何をしているのかを説明しますが、なぜそのクラスがfinalであるのかについての説明ではありません。 –

+1

「時々」 - 実際はデフォルトにする必要があります! –

+0

finalクラスと動的クラスローディングとセキュリティの間に概念がありますか.Plz explain。 –

6

セキュリティ上の理由から、最終的なものです。他にも理由があるかもしれませんが、セキュリティが最も重要です。

java.lang.Stringを継承し、独自の変更可能な実装をセキュリティに敏感なAPIに提供するとします。 APIは選択肢がありませんが、あなたの文字列(置換原則を覚えておいてください)を取ることはできますが、それがチェックされた後であっても(並行スレッド上またはAPIが返された後に)文字列を変更することができます有効です。

同じことは、プリミティブのラッパーになります。これらのクラスを使用してAPIでエンコードされた動作についての重要な前提に違反するため、これらを変更することは望ましくありません。

Stringを最終的に作成することで、他の人たちが独自の潜在的に敵対的なクラスの実装をStringのように提供しないようにすることで、この問題を解決します。

関連する問題