2016-03-23 5 views
1

元のコードベースを継承し、元の開発者に連絡することはできません。宣言時にBeanに新しい文字列を作成する目的は?

通常のJava Beanでは、変数の宣言、ゲッター、セッターがあることを理解しています。

public class FooBean{ 
    private String foo; 
    private String bar; 

    // getters and setters 
} 

ただし、このコードでは、すべての文字列が初期化されていることがわかりました。

public class FooBean{ 
    private String foo = new String(); 
    private String bar = new String(); 

    // getters and setters 
} 

このBeanは、特定の特殊なケースを持っていない、取り除かinitialisationsとまったく同じように動作しているよう処理するコード。

この方法を作成する理由はありますか?私には実現していない副作用がありますか?

フィールドがNULLに設定されるのを防ぐわけではないので、どちらの場合でも同じ種類の値チェックが必要です。

+0

新しいキーワードを使用してStringオブジェクトを作成する必要はありません。私はこれが不合理だと思う。 – Lathy

答えて

2

Stringオブジェクトを作成するさまざまな方法は何ですか?

通常のJavaクラスのようにnew演算子を使用して文字列オブジェクトを作成するか、二重引用符(リテラル割り当て)を使用してStringオブジェクトを作成することができます。

など、あなたの質問に

char配列、バイト配列、のStringBufferとStringBuilderetcから文字列を取得するStringクラスで利用可能な、あまりにもいくつかのコンストラクタがあります。

我々は、二重引用符を使用して文字列を作成し、JVMは、 Stringプール内を検索して、他のStringが同じ値で格納されているかどうかを調べます。見つかった場合は、Stringオブジェクトへの参照を返します。それ以外の場合は、指定された値を持つ新しいStringオブジェクトを作成し、それをStringプールに格納します。

new演算子を使用すると、JVMはStringオブジェクトを作成しますが、Stringオブジェクトには格納しません。 intern()メソッドを使用してStringオブジェクトをStringプールに格納するか、プール内に等しい値のStringがすでに存在する場合は参照を返します。

は、だから、

String s1 = "abc"; 
String s2 = "abc"; 

ものはStringPoolにチェックされ、s1が既に存在するので、s2が真である、したがって、S1 == S2同じ参照を取るを行うとき。

あなたが行うときには:あなたはnew演算子を使用している

String s3 = new String("abc"); 
String s4 = new String("abc"); 

を、したがって、JVMがチェックされていない文字列は、ヒープ内に既に存在する場合、それだけで新しいスペースを割り当てますs4については、s3 == s4ですか?もちろんです。

具体的な例については、下の画像をご覧ください。

enter image description here

+0

すべての答えは価値がありましたが、これは今後の人々にとって最も有用なものになると感じています。 – Cactus

+0

**複数の回答に同じ回答をコピーして貼り付けない** **してください。質問にすべて同じ回答がある場合は、重複としてマークします。そうでない場合は、特定の質問に合わせた回答を手元に書いてください。コメントのために –

+0

tnskはトピックを認識していますが、 –

2

""の代わりにnew String();を使用する理由がないことを考慮すれば(この場合、別個の空文字列が必要な場合があります)、これはおそらくどこかで学んだ悪い習慣です。

3

これは、最初のNULL以外の値を与えるだけです。

しかし、新しいStringオブジェクトを作成する必要がないので、より良い、

private String foo = ""; 
private String bar = ""; 

を書き文字列プールから空の文字列のインスタンスを再利用する方が良いだろう。

1

いいえ、これは本当に意味がありません。 Stringコンストラクタを単純なリテラル""に使用することは、通常は悪い習慣です。 しかしfoo = new String()foo = ""間の小さいが重要な違いがある:

String foo1 = new String(); 
String bar1 = new String(); 
System.out.println(foo1 == bar1); 

String foo2 = ""; 
String bar2 = ""; 
System.out.println(foo2 == bar2); 

本の出力は、同じリテラルを指します

false 
true 

foo2bar2なり、したがってあろうが「等しいです」 (==の意味で)。詳細については、hereを参照してください。

ただし、これに頼るべきではありません。文字列に常にequalsを使用してください。

関連する問題