不変性を--String一度愚かな経験を忘れないでください

序文

ヘッドのみが強くなることができます。

テキストは、私のGitHubリポジトリに含まれている、歓迎スター:https://github.com/ZhongFuCheng3y/3y

録音したら、コードを書くときにその愚かな操作、この関わる知識:文字列の不変性

一、交代背景

私はここにテキストメッセージを送信するためにRPCインターフェースを提供するシステムを持っています。私は、着信電話番号の外部インタフェースを呼び出し、そのパラメータに、私は、これらのパラメータの解決を担当しています、いくつかのビジネスの契約を行い、その後、SMSテキストメッセージのチャネルパートナーを送信するインターフェイスを呼び出す必要があります。

たびSMSチャネルインタフェースエンドコール、私は同様に、領収書を返し、(MySQLの中に格納されている)、着信、この文書を送信する私にSMSチャネル商工会議所や失敗を送信し、私は(ストレージに置く店MySQLで)。

その日は、誰かが私を見つけるために、電話番号がテキストメッセージを受信できないと言うと、ユーザーはSMS(延滞、シャットダウン)、およびテキストメッセージを受け取るので、いくつかの操作を遮蔽しません。

だから私はそれをトラブルシューティングするために行ってきました、私はDBの内側に発見するつもりですすべての最初は、このレコードが存在することが発見され、対応するレコードを送信していないが、DBで珍しい何も出てきません。

  • (それはストレージに入れていたように、確かにSMSのオペレータ・インタフェースを介して呼び出します)ので、これは、傍受される例途中でこの操作を除外しました

その後Qulaoログの結果オブジェクトは、SMS演算子の戻りを呼ん情報を参照するには、その後、この問題の原因を表示されることがありますメッセージについてオペレーターに依頼してくださいはい。返事がありました:「それは、電話番号の一部である場合、このような状況を表示され、あなたの電話番号は何のトリムああではありませんか?

だから、私は、ログインして、実空間との電話番号の背面が(心にカットし、前に見に失敗している)が見つかりQulao。この問題に対処するには、うまく内部入り口に私の携帯電話番号のトリム限り、非常に簡単になります。

第二に、コードを書きます

私がサポートするためにここにいる複数の電話番号に同じSMSを私はここに受け取るためにHashSetのを使用して、携帯電話の番号を。トリムの電話番号は、私は次のコードを書きました:

// 说明:Task对象 有个 key属性,这个key属性的类型是HashSet

if (task.getKey() != null && task.getKey().size() > 0) {
    for (String s : task.getKey()) {
        s.trim();
    }
}

コードはシンプルですが、私は2つのステップでそれを実行します。

  • nullの場合、null値は、電話番号のコレクションを横断していないかどうかを確認
  • 各電話番号をトリムすること

上記のコードは、問題ありますか?、ああ、私は何を書いても問題に問題があってはなりません。

小さなデモを書き、次の、我々は見つける:コードの11行で呼び出すtrim()メソッドの後、次にライン12で出力、または状況が空白になります。

サンプルコード

2.1なぜ、この錯覚はありますか?

実際には、我々は、Javaを学び始めたとき、確かにあなたは、Stringクラスを学びます。学習するときに明確な文字列でもある不変、常に変化に感じ、私たちStringオブジェクトを持っている、その理由は?

不変の文字列

私は、最初のポイントはこれですと思う:当社の事業は、多くの場合、変数のオブジェクトであり、変更されたオブジェクトのプロパティのいくつかは、我々が変化したと思いました。たとえば、次のコード:

HashSet<Student> students = getStudent();
for (Student s1 : students) {
    s1.setName("Java3y");
}

実行、我々はそれが内部の学生のHashSetの名前でJava3yを変更して、実際には真実であると思います。

私は2番目のポイントは、このだと思う:私たちは通常、Stringオブジェクトを操作し、過去の操作パスの直接の結果である、それは元のオブジェクトを変更すると同じように見えます。次のようなコード:

// 去重
String phone = "   137888888888    ";
sendPhone(phone.trim());

// 转成大写后输出
System.out.println(phone.toUpperCase());

// ... 等等

新しいStringオブジェクトを返します。

2.2を変更する方法

さて、問題は「一見」オリジナルStringオブジェクトが変更された、Stringオブジェクトは不変であり、文字列が動作するオブジェクトを、知られているが、実際には、新しいStringオブジェクトを生成しました。

私は、解決、問題に戻りtrim、リストHashSetの上で電話番号を設定した方が良いです

// 说明:Task对象 有个 key属性,这个key属性的类型是HashSet

HashSet<String> hs = new HashSet();
if (task.getKey() != null && task.getKey().size() > 0) {
    for (String s : task.getKey()) {
        hs.add(s.trim());
    }
}
task.setKey(hs);

遂に

Bは、彼が、本当に恥知らずな「合理的」であるバグを書いた方法を説明する記事を書きました。

喜んで出力乾貨物の Javaテクノロジ公共数の:Java3yパブリック数200件の以上のオリジナルの記事技術記事、大量のビデオ資源、美しいマインドマップは、注意が得ることができます!

友人のサークルに転送私にとって最大のサポートです!

私はポイント、記事がよく書かれていると思う賞賛を

おすすめ

転載: www.cnblogs.com/Java3y/p/11229748.html