誤解ごとに、以下が全員に表示されます。
1。NULLの過度の使用
NULLの過度の使用を避けることがベストプラクティスです。たとえば、より良いアプローチは、プログラムがnullpointerexceptionを投げるのを防ぐことができるため、メソッドをnull値の代わりに空の配列またはコレクションに戻すことです。次のコードフラグメントは、別の方法からコレクションを取得します。
list <string> accountids = person.getaccountids();
図にアカウントがない場合、getAccountids()はnull値を返し、プログラムはnullpointerexceptionの例外を廃止します。したがって、この問題を解決するには、空気チェックに参加する必要があります。返されたnull値を空のリストに置き換えると、nullpointerexceptionは表示されません。さらに、変数AccountIDの短いチェックを取得する必要がなくなったため、コードはより簡潔になります。
ヌルの値を避けたい場合、さまざまなシナリオが異なるプラクティスを取る場合があります。 1つの方法は、オプションのタイプを使用することです。これは、空のオブジェクトまたは一部の値のパッケージの両方である可能性があります。
optional <string> optionString = option.ofnullable(nulledstring);
実際、Java8はより簡潔な方法を提供します。
optional <string> optionalString = optional.ofnullable(nullialString);
JavaはJava8バージョンのオプションタイプをサポートしていますが、機能プログラミングの世界で広く知られています。それ以前は、Google GuavaのJavaの初期バージョンで使用されていました。
2。異常を無視します
私たちはしばしば異常を無視します。ただし、ベストプラクティスは、初心者や経験豊富なJavaプログラマーのためにそれらに対処することです。異常な投げは通常意図的であるため、ほとんどの場合、異常を引き起こすイベントを記録する必要があります。必要に応じて、この問題を過小評価しないでください。少なくとも、他の開発者に原因と結果を知らせるために、この異常が対処されていない理由を説明する必要があります。
selfie = person.shootaselfie(); {selfie.show();}
重要でないことを強調する簡単な方法は、この情報をこのような異常な変数名として使用することです。
次のようにコードコードをコピーします。
try {selfie.delete();} catch(nullpointterexception unmimportant){}
3.異常を同時に変更します
この異常は、コレクションオブジェクトで発生し、同時にIteratorオブジェクトによって提供されるメソッドを使用してコレクションのコンテンツを更新しません。たとえば、ここには帽子リストがあり、耳のフラップを含むすべての値を削除する必要があります。
list <ihats = new arraylist <>(); hasearflaps()){hats.remove(hat);}}
このコードが実行された場合、ConcurrentModificationExceptionはスローされます。これは、コードがこのコレクションを横断しながらそれを変更するためです。複数のプロセスが同じリストに作用すると、プロセスの1つがリストを横断する場合、他のプロセスはリストコンテンツの変更を試み、同じ異常も発生する可能性があります。
マルチスレッドコンカレント修正コレクションコンテンツでは非常に一般的であるため、同期ロック、同時変更のための特別なセットなど、同時プログラミングで一般的に使用される方法を使用する必要があります。 Javaは、この問題を単一のスレッドとマルチスレッドの状況で解決します。
オブジェクトを収集し、別のサイクルで削除します
直接的な解決策は、帽子を耳のフラップでリストに入れて、別のサイクルで削除することです。ただし、帽子を削除するために追加のセットが必要です。
list <ihatstoremove = new linkedlist <>();
iterator.removeメソッドを使用します
この方法はより簡単で、同時に追加のコレクションを作成する必要はありません。
iterator <ihatitrator = hats.iterator();
Listiteratorを使用する方法
リストインターフェイスのコレクションのコレクションが実装されると、リストイテレーターは非常に適切な選択肢です。リスターインターフェイスを実装するイテレーターは、削除操作をサポートするだけでなく、操作の追加と設定もサポートします。リストストレーターインターフェイスはイテレーターインターフェイスを実装するため、この例はイテレーターの削除方法に似ています。唯一の違いは、帽子のタイプのタイプであり、listotrator()メソッドを使用するイテレーターメソッドを取得します。次のフラグメントは、listterator.removeとlistotrator.addメソッドを使用する方法を示しています。
ihat sombrero = new sombrero(); ; hattenrator.add(sombrro);}}
ListIteratorを使用して、削除と追加メソッドを呼び出して、1つのセットメソッドのみを呼び出すことができます。
ihat sombrero = new sombrero(); ); //削除する代わりに設定}}
Java 8のストリームメソッドを使用します
Java8では、開発者はいくつかの条件に応じてコレクションをストリームに変換し、ストリームをフィルターすることができます。この例では、Stream APIフィルターがどのように帽子をかぶっており、同時モジオ化のエクセプトを避けています。 hats = hats.stream()。
次のようにコードコードをコピーします。
.collect(collectors.tocollection(arrayList :: new));
collectors.tocollectionメソッドは、フィルタリングされた帽子の値を保存する責任を負う新しいアレイリストを作成します。フィルタリング条件が多数のエントリが除外された場合、ここで大きなアレイリストが生成されます。したがって、注意して使用する必要があります。
java 8でlist.removeifメソッドを使用します
Java 8 -Removeifメソッドで、より簡潔で明確な方法を使用できます。
次のようにコードコードをコピーします。
hats.removeif(ihat :: hasearflaps);
下部では、iterator.removeを使用してこの操作を完了します。
特別なコレクションを使用してください
最初にarrayListの代わりにcopyonWritearrayListを使用することにした場合、問題はありません。 CopyOnWritearrayListは変更されたメソッド(セット、追加、削除など)を提供するため、元のコレクションアレイは変更されませんが、新しい変更バージョンを作成します。これにより、Traversalが元のバージョンを変更できるため、ConcurrentModificationExceptionが廃止されません。このコレクションの欠点も非常に明白です - 変更ごとに新しいコレクションが生成されます。
CopyOnWritesetやConcurrenthashmapなど、さまざまなシナリオに適したセットがあります。
同時変更中に発生する可能性のある別のエラーについては、コレクションからストリームを作成すると、バックエンドコレクションを変更します。ストリームの一般的な基準は、ストリームをチェックするときにバックエンドコレクションの変更を避けることです。次の例では、ストリームを適切に処理する方法を示します。
list <ihat> filedhats = hatstream()
Peekメソッドは、すべての要素を収集し、各要素に対して確立されたアクションを実行します。ここで、アクションは、基本リストからデータを削除しようとすることです。これは明らかに間違っています。このような操作を回避するために、上記の方法をいくつか試すことができます。
4。防衛
時には、より良い協力を得るために、標準的なライブラリまたは第三者が提供するコードは、共通の依存関係を遵守する必要があります。たとえば、ハッシュコードと平等の共同契約に準拠する必要があります。これは、Javaコレクションフレームワークの一連のコレクションクラスと、ハッシュコードと等しい方法を使用して他のクラスの一連のクラスが正常に機能することを確認する必要があります。例外やコードコンパイルの破壊などのエラーに準拠しないでください。
エラーコードは生産環境に忍び込み、多くの悪影響を引き起こす可能性があります。これには、UIエクスペリエンスの低下、間違ったデータレポート、アプリケーションのパフォーマンスの低下、データの損失などが含まれます。幸いなことに、これらの壊滅的なエラーはあまり発生しません。ハッシュコードとEqualsは、表示されるシーンが次のようになる可能性があることを前に述べています。コレクションは、HashmapやHashsetと同じように、オブジェクトまたは比較するターゲットに依存します。簡単に言えば、本契約には2つの基準があります。
2つのオブジェクトが等しい場合、ハッシュコードは等しくなければなりません。
2つのオブジェクトに同じハッシュコードがある場合、それらは等しいか異なる場合があります。
破壊の最初の基準は、ハッシュマップからデータを取得しようとすると、エラーを引き起こします。 2番目の基準は、同じハッシュコードを持つオブジェクトが必ずしも等しくないことを意味します。
最初の基準を破壊する結果を見てみましょう。
public static class boat {private string name(this.name = name;} @override public boolean equest {if(this == o)if(o == null || GetClass()! int hashcode(){return(int)(math.random() * 5000);}}
ご覧のとおり、ボートクラスは等しいコードメソッドとハッシュコードメソッドを書き直します。ただし、HashCodeが各コールの同じオブジェクトのランダム値を返したため、契約を破壊しました。実際には、このタイプのボートを事前に追加しましたが、次のコードはハッシュセットでエンタープライズと呼ばれるボートを見つけられない可能性があります。
public static void main(string [] args){set <boat> boats = new Hashset <>(); (新しいボート( "Enterprise");};}
別の合意は、最終的な方法です。機能的な説明に関する公式Javaドキュメントへの参照を次に示します。
Panizeの従来の契約は、Javatm仮想マシンが、すべてのスレッドが特定の動作の結果として指定されたオブジェクトにアクセスできなくなったと判断した場合です。 Finalizeメソッドには、このオブジェクトを使用することを含む複数の機能があります。ただし、ファイナライズの主な目的は、不可解なオブジェクトを破棄する前に明確な操作を実行することです。たとえば、入力/出力接続オブジェクトを示すファイナライズメソッドは、永久廃棄オブジェクトの前に明示的なI/Oトランザクションを実行して接続を中断することができます。
ファイルプロセッサでファイナライズメソッドを使用してリソースをリリースすることを決定できますが、この使用法は悪いです。ゴミリサイクル中に呼び出され、GCの時間がわからないため、最終化の時間は保証されません。
5。パラメーター化の代わりに元のタイプを使用します
Javaのドキュメントによると、説明:元のタイプは、パラメータ化されていない、またはRMの非停止メンバー(Rの親または親インターフェイスの非標識)のいずれかです。 Javaジェネリックタイプが導入される前に、原始的な代替タイプはありませんでした。 Javaは、バージョン1.5の一般的なプログラミングをサポートしており、これが重要な機能改善であることは間違いありません。ただし、逆方向の互換性のため、タイプシステム全体を破壊する可能性のあるトラップがここにあります。例を挙げてください:
listofnumbers = new ArrayList()
これは、元のArrayListとして定義されている数字のリストです。タイプパラメーターを指定していないため、任意のオブジェクトを追加できます。ただし、最後の行は、INTタイプに含まれる要素をマッピングし、2を掛けて、データを2倍のデータを標準出力に印刷しました。
このコードはコンピレーション中にエラーが発生しませんが、実行されると、キャラクタータイプを整形手術にマッピングしようとしているため、実行中にエラーが発生します。明らかに、必要な情報が隠されている場合、タイプシステムはセキュリティコードの作成に役立ちません。
この問題を解決するには、コレクション内のオブジェクトの特定のタイプを指定する必要があります。
list <integer> listofnaylist <()();
前のコードとの唯一の違いは、コレクションを定義する行です。
次のようにコードコードをコピーします。
List <Integer> listofnumbers = new ArrayList <();
修正されたコードコンパイルは、予想されるストレージプラスチックのみのコレクションに文字列を追加しようとしているため、渡すことはできません。コンパイラはエラーメッセージを表示し、20文字をリストに追加する行を指します。パラメーター化汎用タイプは良い考えです。この場合、コンパイラは考えられるタイプを確認できるため、矛盾によるランタイムの異常な可能性が大幅に削減されます。
上記の5人のJavaプログラマーの主な要約は、しばしば間違いを犯します。誰もがそれを好きになることを願っています。