2016-12-16 8 views
4

Optional.of()Optional.ofNullable()上で使用する必要がありますなぜ私はhereを読んだが、答えはすべてで私を満たしていなかったので、私は少し異なる尋ねる:Optional.of()を使用する本当の理由はありますか?

あなたのメソッドがnullを返さないことが確実な場合は、理由をすべきOptionalを使用していますか?私が知る限り、それは多かれ少なかれ、null値を扱わなければならないかもしれないという、 "方法のユーザー"を思い出させることです。 nullの値を扱わなければならない場合、どうして彼はOptionalで悩まされるべきですか?

私は最近、私のサービスレイヤーがnullの代わりにOptionalsを返すようにしたので質問します(状況によっては)。私はOptional.of()を使い、NullPointerを投げたときに非常に混乱しました。

私がやったことのサンプル:

Optional valueFromDB = getUserById("12"); 
User user = valueFromDB.get(); 

..... 

public Optional<User> getUserById(String id) { 
    //... 
    return Optional.of(userRepository.findOne(id)); // NullPointerException! 
} 

ヌルができない場合は1がOptionalでそれをラップする理由、私は表示されません。リンクされた答えの男は、「うーん、もしNullPointerが起これば、すぐに起こる」と言った。しかし、私は本当にそれが欲しいですか? Optionalの唯一の目的が、そのようなオブジェクトを取得したプログラマに覚えておくために、nullを念頭に置いて(彼はそれをアンラップしなければならない)、なぜラップ時にNullPointerExceptionを持ちたいのですか?


編集:それは私はすでにリンクされていても、重複としてマークされてしまったので、私は、質問を編集するために必要な開始からの質問と述べました。私は答えがなぜ私を満足させなかったのか説明しましたが、私は今テキストを編集する必要があります。私は5件の回答を得たので しかし、ここでは、私がお聞きしたいものにいくつかの付録であると誰もが異なる場合に答えるが、どれも完全に私はここにお願いしてみてください何をカバーしていない:

は理由があり、それをOptional.of (null)は不可能で、nullの場合はOptional.ofNullable()を特別に追加しましたか?

ストリームの使用は私の実装の考え方では問題ではありません。 私はあなたの答えから多くの洞察を得ました。しかし、本当の疑問は今まで私が話す/読む/理解できる限り、答えられていない。 私は質問してください。「Optional.of()メソッドを削除してJava 9でOptional.ofNullable()しか許可しないと、後方互換性以外の問題はありますか?

+4

「オプション」の唯一の目的は、結果がない可能性があることを明確に示すことです。適切に使用すると、 'null'チェックを行う必要はなく、' user.ifPresent(doAMethod()) 'を実行することも、' null '要素をチェックすることなく、ストリームや他のJDK8 APIで使用することもできます。したがって、適切に使用すると、コード内のヌルチェックの量を減らすことができます。 –

+0

@MDeinum: 'ifPresent'は基本的にヌルチェックです。 :Pそれはちょうど良く見え、使いやすくなっています。私はストリームでものを得るが、それは質問自体とは関係がありません。私はOptionalalsについて質問しませんでした。もし 'Optional.of()'が役に立ちましたら質問しました。ごめんなさい。 – codepleb

+0

あなたのメソッドがnullを返すことを意図していない場合、私はあなたが 'Optional'を返さないことに同意します。一方、あなたが返す予定の値がエラーによってnullであるかどうかを知りたいと思っています。私はそれのために良い古い 'assert'ステートメントを使用します。 –

答えて

1

返品価値があると確信できる場合は、オプションを使用しないでください。

あなたのメソッドは、常に値を返すことはわかりません!

getUserById(-1)への呼び出しを考えてください。このIDを持つユーザーは(通常)存在し、ユーザー投稿nullを返します。

この場合、Optional.ofNullableを使用する必要があります。

https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html#ofNullable-T-

+2

ええ、問題は、 'Optional.of()'がまったく存在しない理由です。 – codepleb

6

あなたは、特定の実装コード内の知識とAPIの設計根拠を混合しています。値が存在しない可能性があり、メソッド内の特定のコード位置では、確実に存在することがわかっているので、メソッドがOptionalを返すと宣言することは完全に可能です。私。

String content; 
public Optional<String> firstMatch(String pattern) { 
    Matcher m = Pattern.compile(pattern).matcher(content); 
    return m.find()? Optional.of(m.group()): Optional.empty(); 
} 

このメソッドの戻り型がOptionalインスタンスを作成するコードの場所で、値が存在するか否か知られているが、存在しないかもしれないString表します。ここでnullの値を検出することではありません。マッチングnull素子の場合には存在しないため、その存在の変換をサポートすることは明示的にサポートされていないのに対し、同様に、ストリームAPIメソッドfindFirst()findAny()内で、整合素子があるかどうか、一点で知られているであろう

とお返事はNullPointerExceptionper specificationとなっています。したがって、Optional.ofStream.of((Object)null) .findAny();

+1

別の例として、[ここ](http://stackoverflow.com/questions/31696485/why-use-optional-of-over-optional-ofnullable#comment51344170_31696584)を参照してください... – Holger

1

アンジェリカランガーを使用しているときに簡単にスタックトレースを認識することができ、一致する要素を、返すために使用されますOptional.ofNullableOptionalから他の両方の静的メソッドを呼び出し、唯一のコンビニエンスメソッドであることを述べています。

return value == null ? empty() : of(value) ; 

はまた、彼女はOptional.ofNullableがAPIに最近追加されたことをこう述べていますように、それは実装されています。ここで

はドイツ語で彼女のテキストです:http://www.angelikalanger.com/Articles/EffectiveJava/80.Java8.Optional-Result/80.Java8.Optional-Result.html

ヌルが早期に発見されなければならないエラー、ある場合にのみ、だから私はOptional.ofを使用します。あなたはvalueはnullにすることはできませんことを知っているときOptional.of(value)を使用する Why use Optional.of over Optional.ofNullable?

+0

@ OleV.V。ありがとうございました。私はそれを修正しました。 –

3

他の理由あなたがそのOptionalに追加のフィルタリング操作を行いたい場合に:これはTagir Valeevはで言ったものです。例えば

public static long getPageSizeFrom(HttpServletRequest request) { 
    return Optional.of(request.getParameter("pageSize")) 
        .filter(StringUtils::isNumeric) 
        .map(Long::valueOf) 
        .filter(page::hasPageSize) 
        .orElse(page::getDefaultPageSize) 
} 
1

オプションは、多くの痛みと手を引き起こした関数型プログラミング言語から輸入し、OOと手続き型プログラマwithout muchbackground explanationのラップに投棄されたものの一つであります...絞首刑大幅これに空気をクリアするのに役立ちます

まず、(ない私が)のブログ記事へのクイックリンク:The Design of Optional

オプションは、Haskell Maybeのような関数型プログラミングのタイプに関連しています。関数型プログラミングで強力な型付けが機能するため、その言語のプログラマーは、値がSomethingまたはNothingのいずれかになると言うことがあります。 SomethingとNothingは実際には異なるタイプです。たぶんの中の値を必要とするものは、両方を処理するためにを持っています。両方を扱えない場合、コードは単純にコンパイルされません。

このシナリオと、オブジェクトが値を持つか、nullになるCベースのオブジェクト指向言語(Java、C#、C++など)の典型的な状況と比較してください。メソッドがヌルパラメーターを端のケースとして扱う必要がある場合は、そのコードを明示的に記述する必要があります。私たちすべてが怠惰なプログラマーであることは、私たちが気にしないことです。

nullケースがの場合は常にが明示的に処理されない限り、コードがコンパイルされない場合のコーディングを想像してください。これは、関数型言語でMaybeを使用するとどうなるかと非常によく似ています。

関数型プログラミングから言語機能を引き出すと、コンパイラは常にそのように動作し、常にコード化しています...接続が切断されていることがわかります。

これとは別に、オプションはヌルの単純なスタンドインとして使用できます。この方法に慣れていて、新しいものだと思われるので、magpie developersは以前にヌルチェックが行われていた状況の代わりに使用する傾向があります。しかし、結局、foo.isPresent()は本当になので、はfoo!= nullとは異なります。それが唯一の違いならば、それは無意味です。

さらに、Javaでオートボックスとアンボックスのスタンドインを使用する方法についても説明しません。

Javaのオプションの特定のAPIに関する具体的な質問に戻ると、ofNullable()とof()を比較すると、私が解決できる最良の点は、おそらく典型的なものコード。それらは主にstream()操作の終わりの端で使用されます。あなたはOptional.of()とOptional.ofNullable()のコードを見ることができ、値がnullでその状況に合ったものを手配しているかどうかのofNullableチェックだけです。

私は、Java 8ストリームを使用していない限り、私は不自由な目にはJavaでOptionalを使用する利点がたくさんありません。 Someは、オプションとして非ストリーム使用のタイプとしてオプションを使用することの主な利点は、特定のパラメータがオプションであることを指定することです。もう一度、単純にヌルで行うことができます。しかし、私はオプションと関連付けられた精神的な手荷物は、おそらくより冗長なコードのあらゆる前進段階で、オプショナル(この特定のケースでは)がほぼ完全に美容であることを人々に理解させるために、複数のステップを後ろ向きにしていることを意味する。あなたが記述した状況では、おそらく、ヌルとヌルチェックを使用することに戻ります。

+0

あなたの正直なご意見ありがとうございます。それらを(私にとって)使う最大の理由は、デベロッパーに思い出させるために、値がnullである可能性があるということです。静的コード分析は基本的に同じことができます。 – codepleb

関連する問題