ホームページ > Java > &#&チュートリアル > `CaseInsensitiveString` オブジェクトを作成するときに、`String` オブジェクトではなく、なぜ `new` を使用する必要があるのでしょうか?

`CaseInsensitiveString` オブジェクトを作成するときに、`String` オブジェクトではなく、なぜ `new` を使用する必要があるのでしょうか?

Mary-Kate Olsen
リリース: 2024-11-13 08:23:02
オリジナル
818 人が閲覧しました

Why is it necessary to use `new` when creating a `CaseInsensitiveString` object but not a `String` object?

Java で文字列を作成する: "String s = new String("silly")"

Java で文字列を作成する場合、 String クラスの動作を理解することが重要です。 Java の他の多くのクラスとは異なり、String リテラルは new キーワードを必要とせずに String オブジェクトを自動的に作成します。ただし、new 演算子を使用して新しい String オブジェクトを作成することは、不必要なメモリ消費につながる可能性があるため、明示的に推奨されません。

これを説明するために、次のコードを考えてみましょう。

String s = "No longer silly";
ログイン後にコピー

この中でこの場合、リテラル「もう愚かではない」が s 変数に直接割り当てられ、その結果、単一の String オブジェクトが作成されます。ただし、次のコード スニペット

String s = new String("silly");
ログイン後にコピー

は、不要な追加の String オブジェクトを作成します。これを回避するには、最初の例で示したように、可能な限りリテラル割り当てを使用することをお勧めします。

ただし、String オブジェクトを動的に作成する必要がある場合もあります。たとえば、次のクラスについて考えてみましょう:

public final class CaseInsensitiveString {
    private String s;
    
    public CaseInsensitiveString(String s) {
        if (s == null) {
            throw new NullPointerException();
        }
        this.s = s;
    }
}
ログイン後にコピー

このシナリオでは:

  1. 最初のステートメントはなぜ正しいのでしょうか? CaseInsensitiveString cis = "Polish"; ではないでしょうか?
    最初のステートメント CaseInsensitiveString cis = new CaseInsensitiveString("Polish"); は正しいです。一般に、String オブジェクトにはリテラル割り当てを使用することが推奨されますが、このルールは CaseInsensitiveString などの他のクラスのオブジェクトには適用されません。この場合、CaseInsensitiveString クラスの新しいインスタンスを作成するには new キーワードが必要です。
  2. 上記のステートメントが (String を拡張してもしなくても) OK になるように、CaseInsensitiveString を String のように動作させるにはどうすればよいですか? String では、そのようにリテラルを渡すだけで問題ないのはなぜでしょうか?私の理解では、Java には「コピー コンストラクター」という概念はありません。
    Java の String クラスは、他のクラスと比較して独特の動作をします。具体的には、リテラルは暗黙的に String オブジェクトに変換されるため、明示的に構築する必要がなくなります。これにより、 String s = "Polish"; のようなステートメントが可能になります。新しい演算子を呼び出すことなく。 Java には、同等の「コピー コンストラクター」の概念がありません。代わりに、String クラスは不変性と、リテラル文字列などの文字シーケンスを受け入れて新しい String オブジェクトを作成する事前定義されたコンストラクターを提供します。

以上が`CaseInsensitiveString` オブジェクトを作成するときに、`String` オブジェクトではなく、なぜ `new` を使用する必要があるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート