8

皆さん、

私はここで言及されているJavaのベストコーディングプラクティスを経験していました
http://viralpatel.net/blogs/most-useful-java-best-practice-quotes-java-developers/

2番目の引用は言う、

引用2:クラスのインスタンスフィールドを公開しないでください

私はそれが絶対に正しいことに同意します、しかし私はこの引用の数行下の作家の推薦に従うことに行き詰まりました。

彼は言い​​ます、


private String[] weekdays = 
    {"Sun", "Mon", "Tue", "Thu", "Fri", "Sat", "Sun"};

public String[] getWeekdays() {
    return weekdays;
}

しかし、getterメソッドを記述しても、問題が正確に解決されるわけではありません。アレイには引き続きアクセスできます。変更できないようにする最善の方法は、配列自体ではなく、配列のクローンを返すことです。したがって、getterメソッドは次のように変更されます。

public String[] getWeekdays() {
    return weekdays.clone();
}

私自身clone()、Javaクラスのgetterメソッド内で使用したことはありません。

私は疑問に思っています(それは良い習慣の1つであると言われているので)-なぜ1つshould use/shouldn't use clone()内部ゲッターメソッド?そしてどのシナリオで?

それはJavaの優れたコーディング手法であると見なされますか?

ありがとう

4

4 に答える 4

6

これについては、JoshuaBlochの著書「EffectiveJava」で説明されています。「必要に応じて防御コピーを作成する」というセクションがあります(第2版のセクション39)。

https://www.informit.com/articles/article.aspx?p=31551&seqNum=2

このようなトピックについて詳しく説明するのに適した本です。

于 2012-09-24T06:54:13.273 に答える
3
private String[] weekdays =      
    {"Sun", "Mon", "Tue", "Thu", "Fri", "Sat", "Sun"};  

public String[] getWeekdays() 
{     
    return weekdays; 
} 

メソッドを使用しない場合clone、このクラスのユーザーは多くの非倫理的なことを行う可能性があります。

  1. 日の順序を変更し、
  2. 日の名前を変更し、
  3. ..。

ただし、クローンを返すことはクラスとそのデータに影響しません。したがって、クラスの他のユーザーは影響を受けません。

于 2012-09-24T06:08:37.550 に答える
2

オブジェクトグラフ全体(配列を含む)が不変であることを保証したい場合は、clone() or System.arraycopy()オンにします。get()これは通常、配列を公開するAPIがパブリックであり、配列内の値に制約がある場合、またはオブジェクトが複数のスレッドによってアクセスされる場合に実行されます。このような場合、不変性が重要です。

たとえば、メソッドを持つGroceryStoreオブジェクトがあるとしますgetItemsSortedByPrice()。価格による順序を維持する配列にアイテムを保持しますが、この配列を返すと、クライアントコードがそれを変更し、オブジェクトの(内部)不変条件を壊す可能性があります。

これが内部コード(つまり、パブリックAPIの一部ではない)であり、配列を変更しないことがわかっている場合は、実際のメリットなしにパフォーマンスが低下するため、クローン作成/コピーはおそらく必要ありません。

すべてはコンテキストに依存します。

配列は単なるオブジェクトであり、通常のオブジェクトに適用されるすべての(不)可変性のルール/プラクティスは、配列にも適用されます。

于 2012-09-24T06:27:09.390 に答える
1

あなたのユースケースは提案されたJavaコードと一致していないと思います。この例は、あなたのユースケースとは異なるユースケースです。

最終的な配列は列挙型のように聞こえますが、これは要件にはるかによく一致していると思います。

于 2012-09-24T06:48:23.347 に答える