オプションの簡単な使用およびNPEでのビジネス上の問題を解決することはできません

仕事は、多くの場合、NPE、問題に対処するに対処するためのオプションである答えのほとんどを得るが、これにどのように(NullPointException)に遭遇単にオプションを使用し、ビジネスにNPの問題を解決することはできませんがだから、参考のために日々の作業プロセスNPE問題の考え方を整理。

アイデアを見てください:

NPEの問題解決のアイデア

01回避操作

オプションのパラメータ01.01の使用は避けてください

毎日の仕事は、次のコードを参照することがあります。

public void execute(Optional<String> nameOptional) {
   ...
}
复制代码

パラメータ法がnullの場合もある場合は、代わりにヌルを渡すので、メソッドのオーバーロードを使用することができます。より良いビジネスだけで意思よりも達成するためにコードを明らかにビジネスの意図ので、ヌルが発生した場合のビジネスは、ヌルビジネスセンスではなく、必要性は、関連するロジックを対処するため、あなたはメソッドのオーバーロードを使用することができます。

また、メソッド呼び出しは、非常に明確なパラメータはオプション構築メソッドを呼び出す必要はありません動作します。

public void execute() {
     execute(null);
}

public void execute(String name) {
    ...
}
复制代码

上記のコードは外部メソッドの漠然とした意図を避けるために、だけでなく、コードセクションの重複を避けるために。

01.02避け複数行の場合()文

開発者がオプションをのことを聞いただけで連絡先を仕事表現され、「オプションを使用して、私はそれぞれの()メソッドを取得しなければならなかった、論理的な変更変更の簡単なああを感じませんでした」。

問題はどこにありますか?我々はクルミクリップを持っていますが、くるみ割り人形を行うには、それとのそれぞれは、クルミをドロップすることで、その後、見つけるとハンマーで壊し差がない場合、結果は一箇所で分割されます。

我々は、設計されたのではなく、コードのうちの復興と言うとき。だから、ときに、よりよい解決策を持っている何かを探して再構築しようとすることができたときに、場合場合は、オプションの不慣れの使用を決定するために実施しました。switch文は、本質的に悪趣味、また、方法を提供し、getメソッドを、提供することに一見オプション追加を取ることができます方向のために見ているので、彼らがどのような目的をしています。

02はどのように行います

02.01は、戻り値を明示的で扱うオプションを使用します

実際の実装は、我々がNULL値を返すために必要がある場合は、我々は、メソッド呼び出し側は戻りnullに可能性があることを知って、そして特定の処理が施さなければならないよう、Optioanlが戻ってオブジェクトを返すことができます。

public Optional<Data> execute() {
    ...
	return Optional.empty();
}
复制代码

02.02適切な使用例外

結果なしロジックは中断期待せずに続行するために必要な場合を除き、我々はOptiona.empty()を返すように選択することはできないだけでなく、あるいは我々が直接スローするように選択することができます。

たとえば、ユーザ名に応じて、パスワードはユーザーが見つからない場合、あなたは直接InvalidUsernameOrInvalidPasswordExceptionを投げることができ、ユーザーを探しています。

public User login(String name, String password) {
	...
	
	throw new InvalidUsernameOrInvalidPasswordException();
}
复制代码

次に、外側の層や例外処理、またはプロジェクトの例外は、グローバルに統一処理をつかまえました。

02.03の使用オプションのラムダ

不慣れが01.02であまり差はないが設けられており、NULL値が感から決定されるので、任意の方法が述べました。ビジネス・シナリオに基づいてOptioanlラムダ文言を選択することをお勧めします。

String name = computer.flatMap(Computer::getSoundcard)
	.flatMap(Soundcard::getUSB)
	.map(USB::getVersion)
 	.orElse("UNKNOWN");
复制代码

より明確に以下の文言よりも上記の文言。もちろん、これはもう少し提供するツールを学ぶよりも、好奇心が必要ですが、常にレンガを移動するのは簡単な作業をすることはありません。

String version = "UNKNOWN";
if (computer != null) {
	Soundcard soundcard = computer.getSoundcard();
	if (soundcard != null) {
		USB usb = soundcard.getUSB();
		if (usb != null) {
			 version = usb.getVersion();
 		}
 	}
}
复制代码

参照

02.03最終的なソースコード

おすすめ

転載: juejin.im/post/5dff74f1e51d4557f638bf5d