Java の文字列は不変であると言われています。だから私が言うなら
String one = "myString";
と
String two = "myString";
内部的には、両方のオブジェクトが同じリテラルを使用します。内部で同じ文字列リテラルを参照しているときに、異なるクラスで文字列をプライベートにする必要があるのはなぜですか。
外部要素(クラスやオブジェクトなど)がクラスの内部にあるメンバーを知らないだけですか?
Java の文字列は不変であると言われています。だから私が言うなら
String one = "myString";
と
String two = "myString";
内部的には、両方のオブジェクトが同じリテラルを使用します。内部で同じ文字列リテラルを参照しているときに、異なるクラスで文字列をプライベートにする必要があるのはなぜですか。
外部要素(クラスやオブジェクトなど)がクラスの内部にあるメンバーを知らないだけですか?
可視性とアクセス権は、実際にはコンパイル中にのみ存在します。これを実行できるかどうかを確認するために、通常、実行時にプライベートメソッドを呼び出したり、さまざまなハックを介して不変データを変更したりできます
別のポイント: これらの文字列は不変であるため、標準的な方法で値を変更することはできません。そのため、メモリ内の同じ場所に配置でき、どのクラスがそれらを使用するかは問題ではありません。
クライアントは内部メンバーをまったく別のものに設定できるためです。String
aが不変であることと参照が であることを混同しているようですfinal
。
このクラスがあると想像してください:
public class MyClass {
public String first = "Test";
public String second = "Test";
}
そのため、Java コンパイラの専門家として、私たちは内部的に知っており、同じオブジェクトfirst
を参照しています。second
涼しい。
今私が使用するときMyClass
:
MyClass myClass = new MyClass();
myClass.second = "Time to do some hackin'";
良くないね。本当に悪いように。
String
メンバーを宣言private
することは、コンパイラの効率の利点を失うこととは何の関係もありません。それは、クラスがその実装をカプセル化して、クライアントが密結合されないようにすることであり、クラスは、クライアントが行った無責任なことによって引き起こされる奇妙な動作について心配する必要がありません。
first
オブジェクト "Test" が不変であるという事実は、私が何かを変更したりsecond
、別のものを指したりできないという意味ではありません。
それが役立つことを願っています。
参考までに、実際にはString
何も変わりません。それは単なる慣習とカプセル化の問題です。他のフィールドがプライベートで、ゲッターとセッターがある場合、String
フィールドを非表示にする必要がないのはなぜですか?