Javaの最終クラスはすべて不変ですか? StringとIntegerはどちらも最終クラスであり、どちらも不変です。最終的なクラスはすべて不変ですか?
答えて
いいえ - 最終的なクラスは、そのクラスから継承できないことを意味します。それは可変性とは関係ありません。次のクラスは最終的には変更可能です:
public final class FinalMutable {
int value;
public void setValue(int v) { value=v; }
public int getValue() { return value; }
}
いいえ、最終的にクラスを拡張できないことを意味します。それは変異性について何も言わない。例:
final class MutInt {
public int modifyMe;
}
不変性のためのキーワードはありません。それはデザインパターンのようです。
編集:
これは、クラスを不変にするキーワードがないことを意味します。クラスを不変にするには、内部または外部を最終的または個人的に保護する必要があります。
混乱することは次のとおりです。最終キーワードは、クラスで使用されたときに異なる意味を持ち、フィールド/変数で使用されたときに異なる意味を持ちます。前者は「このクラスは拡張できません」という意味です。第2の意味は「この変数(または参照)は変更できません」を意味します。他の回答にさらに
フィールドと変数の "最終的な"キーワードがあります - しかし、それはオブジェクトを不変にしません。 – Rytmis
@Rytmis:そうですが、java.lang.Stringのようにクラスを不変にするkeyowrdはありません。私はこれをもっと明確にするために答えを編集します。 –
また、フィールド上での 'final'の使用は、Javaメモリモデル(1.5以降)の特定のセマンティクスでオーバーロードされています。 – Grundlefleck
あなたがjava.lang.String
ためのコードを見れば、あなたはそれがフィールドが含まれ表示されます:hash
、可変あり、実際に計算され、hashCode()
が初めて呼び出されたときに保存されています。
ただし、クラスはまだ不変です。hash
フィールドは直接アクセスすることも、クラス外で変更することもできません。
また、オブジェクトの内部状態を変更せずに公開するために使用できる不変ラッパーの実装は、JDK内で一般的なアプローチになります。例えば
private final List<String> values;
public List<? get String> getValues() {
return Collections.unmodifiableList(values);
}
そして、スレッド安全性のために重要なのは、ハッシュフィールドの遅延割り当ては*良性*データ競合です。そうでなければ、異なるスレッドのhashCode()の2人の呼び出し元は、2つの異なる値を見ることができます。 – Grundlefleck
それは不変性戦略の一翼を担っているもののfinal
は、Javaのクラスimuutableをしない前に、他の人が言ったように。不変性を得るために、あなたは一般的な義務づける方針に従う必要があります。
- をクラスがオーバーライドすることはできませんことを確認 - クラス
final
を作る、または静的なファクトリを使用し、プライベートコンストラクタを保つ - にフィールド
private
とfinal
- 力の発信者を作ります後で
setXXX
メソッドを呼び出す(つまり、Java Beansのコンベンションを避ける)引数なしのコンストラクタを使用する代わりに、オブジェクトを単一のステップで完全に構築します(つまり、Java Beansのコンベンションは避けてください)。 - objecの状態を変更できるメソッドはありませんどのような方法でのトン - だけではなく
setXXX
方法が、クラスは、任意の可変オブジェクトのフィールドを持っている場合、クラスとその呼び出し元
+セキュリティマネージャを追加するリフレクションを使用してアクセシブルフラグを変更しないようにしてください! –
もう1つのこと:コンストラクタ内の可変引数の守備コピーを作成してください。これはEffective Java、2nd Ed。、item#15でカバーされています。 –
Ahhはいアイテム#15-> 5を探しましたが、実際のポイントはコンストラクタのアイテム#39と 'readObject'メソッドのアイテム#76です –
ザ・間を通過したときに、その後、彼らは守備コピーしなければならない状態
最終的なキーワードは、他のクラスがそれを継承するのを防ぎます。最終的なキーワードでは不変ではありませんが、インスタンスクラスのメンバーを非公開にする、セッターを使用しないでゲッターを使用するなどの条件があります
- 1. 非抽象クラスはすべて最終的にするべきですか?
- 2. 最終的な不変性を持つ不変オブジェクトのデザインパターン
- 3. 最終的なクラス変数をGWTで静的にする
- 4. Javaで最終クラスを不変にすることはできますか?
- 5. スイフト。すべてのクラスを最終的にする?
- 6. 最終的な不変オブジェクトは定数ではありませんか?
- 7. CSSグラブすべてのクラス名最終
- 8. ローカル変数はなぜ最終的なのですか?
- 9. Stringはなぜ最終的ですか?
- 10. 最終的なキーワードは何ですか?
- 11. 内部クラス内で最終的ではないローカル変数を使用する
- 12. 抽象クラスには最終的なメソッドがありますか?
- 13. 最終的な変数
- 14. 静的ファクトリメソッドを最終的にするべきですか?
- 15. akka不変のメッセージリストを最終的に参照します
- 16. okhttp3.Responseクラスが最終的にはどうですか?
- 17. すべてのメソッドとクラス変数が静的なのはなぜですか?
- 18. エラー:内部クラスから参照されるローカル変数は、最終的に、または効果的に最終的でなければなりません。
- 19. 内部匿名クラスの最終的でない変数を参照するのがJavaで不可能なのはなぜですか?
- 20. LINQ - 最終的な結果にすべてのフィールドを置く
- 21. Eclipseで非最終的な静的変数を検索する
- 22. クラスを最終的にスピードアップさせるのはなぜですか?
- 23. このクラスはなぜ最終的なものと考えられますか?
- 24. 静的メンバーのみを持つクラスは不変ですか?
- 25. 変数はNetbeansの意味で最終的なものは何ですか?
- 26. フラッタ不変クラスですか?
- 27. 実用的な不変クラスの例
- 28. 私は最終的にJavaを使ってプロジェクトを作るべきですか?
- 29. なぜCocoaPodはすべてのフレームワークを最終的なiOSアプリケーション製品にコピーするのですか?
- 30. 最終的な静的変数を変更してメソッドをテストする
したがって、クラスを不変にするためには、メソッドをインスタンス化し、インスタンス変数(この場合は "value")をfinalにします。 私は正しいです.. ?? – Gourav
はい、セッターを破棄して「値」を確定させる必要があります。 –
それに加えて、Rytmisは以下の点を参考にしています。値が変更可能なオブジェクトであれば、あなたのオブジェクトは本当に不変ですか?最高の価値を秘密にし、防御的なコピーを行うためにgetValueを変更してください。 –