Stringクラスは読み取り専用で、一度生成されるとオブジェクトが保持する文字列が置き換わることはないと、著書『Javaプログラマ(SJC-P)5.0・6.0』のp425に記載がありましたが、なぜStringクラスは読み取り専用に』設定されているのでしょうか?
また、他の読み取り専用クラスの代表的なものはどういったクラスでしょうか?
一旦、自分で調べたのですが、しっくり来る答えに辿り着けなかったので、こちらに記載致しました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
Stringオブジェクトのように、一度生成したらその中身が書き換わることのないオブジェクトを「不変(immutable)オブジェクト」と呼びます。
プログラム内では複数の変数が同じオブジェクトを参照することがあります。どれかからオブジェクトに変更が加えられた場合、そのオブジェクトを参照するすべての変数から見て、そのオブジェクトが変更されたように見えます。
一見便利なようですが、プログラムによっては整合性に問題が生じます。もしStringが不変クラスではなく中身の書き換えが可能であった場合、ある場所でこの文字列を使いたいという時に、別の場所から別の用途のために文字列に変更が加えられた場合、元の場所で使おうとすると中身が変わっていて、困った事態に陥ることにもなります。どこで変更が加えられたかの追跡も困難になります。
また少し発展的な話ですが、HashMapというクラスが存在します。何かのオブジェクトを鍵にして対応する別のオブジェクトを格納する仕組みのクラスなのですが、「同一の鍵に対して1つのオブジェクトしか格納しない」というルールがあります。この時、鍵として格納しているオブジェクトが知らない間に変更されていた場合、いつの間にか同一の鍵が2つ存在するという状態が起こり、このルールが破綻します。
String以外の不変クラスは、プリミティブ型のラッパークラス(Integer,Doubleなど)やBigInteger,BigDecimalなどの大きな数値を扱うクラス、最新のJava8では日時を表すためのDate-Time APIの各種のクラス(LocalDateTime,ZonedDateTimeなど)が該当します。
投稿2016/01/23 17:08
総合スコア20649
0
他の方がきちんと書いて頂いてるので別な方向からヨタ話を。
Javaはジェームズ・ゴスリンさんが開発した言語ですが、当時はギャベージコレクション
持つ言語といえばLispなので影響を受けたんだと思います。
その名残が、java.lang.String.intern()に見られます。これはLispにも同名の関数がありますが
ようするに文字列というのはLispでいうところのシンボルであるという理解でいいんじゃないかなと
思います。FortranやBasicやCでは文字列は配列という考えですが、Lispでは操作するのはListであってシンボルは登録するものだったわけです。
よってJavaでは文字列はシンボルとして概ね不変な扱いになったと思います。
JavaScriptなんかもそうですがLispと比較すると納得する関数が散見されます。
以上ソースはないですが、ヨタ話として。
投稿2016/01/27 07:13
総合スコア210
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
swordone さん回答にもあるように、Immutable Object とよばれるデサイン・パターン(≒クラス設計の定石)の一種です。
なぜStringクラスは読み取り専用に設定されているのでしょうか?
Why String Class is made Immutable or Final in Java - 5 Reasons をテキトーに訳した や Javaの理論と実践: 可変性か、不変性か? でいくつか理由が説明されています。
投稿2016/01/24 05:43
編集2016/01/25 00:52総合スコア6189
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/24 16:07
2016/01/25 00:53
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/24 16:05
2016/01/24 16:12