[解決済み】オプショナルの使用方法
質問
Java 8を使い始めてから6ヶ月ほど経ちますが、新しいAPIの変更にはかなり満足しています。まだ自信がないことの一つは、いつ
Optional
. 私は、何かというとどこでも使いたいような気がします。
null
とか、まったくないとか。
これを使える場面はたくさんありそうですが、それが利点(可読性/ヌル安全性)をもたらすのか、それともさらなるオーバーヘッドを引き起こすだけなのか、よくわかりません。
そこで、いくつかの例を挙げてみました。
Optional
は有益です。
1 - パブリックメソッドの戻り値として、そのメソッドが返す可能性がある場合
null
:
public Optional<Foo> findFoo(String id);
2 - メソッドパラメータとして、パラメータが
null
:
public Foo doSomething(String id, Optional<Bar> barOptional);
3 - Beanのオプションメンバーとして。
public class Book {
private List<Pages> pages;
private Optional<Index> index;
}
4 - イン
Collections
:
一般的にはないと思います。
List<Optional<Foo>>
は何かを追加します - 特に
filter()
を削除するために
null
の値などですが、何か良い使い道はないでしょうか?
Optional
をコレクションで使用することはできますか?
見落としているケースがあれば教えてください。
解決方法は?
の主なデザイン目標は
Optional
は、値を返す関数が戻り値がないことを示すための手段を提供することである。参照
本論
.
これにより、呼び出し元は流暢なメソッド呼び出しの連鎖を継続することができます。
これは、次のようなケースに最も近いと言えます。
#1
の質問で ですが。
値なし
よりも、より正確な表現です。
ヌル
のようなものなので
IntStream.findFirst
がNULLを返すことはあり得ません。
ユースケース
#2
メソッドにオプションの引数を渡せば、うまくいくかもしれませんが、かなり不格好です。例えば、文字列とそれに続くオプションの2番目の文字列を受け取るメソッドがあるとします。このとき
Optional
を2番目の引数として指定すると、次のようなコードになります。
foo("bar", Optional.of("baz"));
foo("bar", Optional.empty());
nullを受け入れても、もっと素敵です。
foo("bar", "baz");
foo("bar", null);
おそらく最良の方法は、1つの文字列引数を受け入れ、2番目の引数にデフォルトを提供するオーバーロードされたメソッドを持つことでしょう。
foo("bar", "baz");
foo("bar");
これには制限がありますが、上記のいずれよりもはるかに素晴らしいものです。
使用例
#3
と
#4
を持つことで
Optional
をクラスフィールドやデータ構造で使用することは、API の誤用とみなされます。第一に、これは
Optional
にあるとおりです。第二に、それは何の付加価値ももたらさない。
の値がない場合の対処法は3つあります。
Optional
代替値を提供する、代替値を提供する関数を呼び出す、例外を発生させる、などです。フィールドに値を格納する場合は、初期化時または代入時に行います。OPが言及したように、リストに値を追加する場合、単に値を追加しないことで、存在しない値を平坦化することもできます。
を本当に格納したい場合、誰かが何らかの作為的なケースを思いつくと思います。
Optional
をフィールドやコレクションで使用することはできますが、一般的にはこのようなことは避けた方がよいでしょう。
関連
-
[解決済み] javaで部分クラスを実装する方法
-
[解決済み] javacが「using unchecked or unsafe operations」という警告を出す原因は何ですか?
-
[解決済み] init-paramとcontext-param
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] Javaオプションパラメータ
-
[解決済み] なぜJava 8のOptionalは引数で使ってはいけないのか
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】Java 8のゲッターはオプションの型を返すべきですか?
-
[解決済み】インデックスで文字列を取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Eclipse デフォルトのフォント名
-
[解決済み] Java の substring() の時間複雑性
-
[解決済み] Eclipse- Dynamic Web Module 3.0 で新しいプロジェクトを作成するときに Java 1.6 以降が必要なエラーが発生する。
-
[解決済み] mavenのコンパイルに失敗するのはなぜですか?
-
[解決済み] javax.naming.NameNotFoundException
-
[解決済み] 親から継承したメソッドの可視性を下げることができない [重複]。
-
[解決済み] JDBC タイプの方言マッピングがありません。1111
-
[解決済み] アニメーションGIFの表示
-
[解決済み] タイプの安全性。アンチェック・キャスト
-
[解決済み] ヘッドリカーシオンとテールリカーシオンの違い [重複]について