私は例について多くを読んでいるOptional
使用する必要があります。
私が言う読んだページに多くのOptional
プライベートインスタンス変数のために使用すべきではありません、代わりにゲッターによって返されるべきであるが。
私は、オプションとして、プライベートインスタンス変数を持つことが、まだ有用であろうと思っているだろう。誰もが自分のコードを見た場合、彼らは代わりにnullが返される可能性かどうかを確認するためにドキュメントをチェックするので、値が空であることを見ることができます。
Scalaのヌルで使用されることはありませんし、Javaとの相互運用性のためだけ実際にそこにあります。値をnullにできるかどうかを常にオプションを使用することをお勧めします。このアプローチは、私に多くの意味があります。
ここではそれを言及するページがあります:
https://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html
ここではサンプルコードです。
private final String addressLine; // never null
private final String city; // never null
private final String postcode; // optional, thus may be null
// normal getters
public String getAddressLine() { return addressLine; }
public String getCity() { return city; }
// special getter for optional field
public Optional<String> getPostcode() {
return Optional.ofNullable(postcode);
}
私が見ることができる唯一の利点は、あなたがオブジェクトをシリアル化したい場合には、変数にオプションの保存されていないとして、それが今できることです。
欠点は、あなたがゲッターの戻り値の型を確認するまで、郵便番号がnullの可能性が分からないということです。あなたがコードに新しかった場合は、NULLポインタ例外を発生させ、このアドオンは、クラスを拡張逃すかもしれません。
ここではScalaのについて尋ねた質問ですOption
。
なぜオプションを使用する方法と、JavaとScalaの違いはありますか?
すべてのJava開発者も、あなたは記載されているアプローチに同意しません。この確認下さいポストをロンボクの作成者によって。
私が使用しての異なるアプローチの理由と推測Optional
Javaでは、Javaのコミュニティは非常にほとんどの人がするために使用された、Javaの8までそれなしで住んでいたということであるヌル。片手で(のような新しいAPIの多くfindAny
からのStream
復帰)Optional
、それでも標準ライブラリのメソッドの多くは、単に返すヌルをあなたはいつもとあなたの関数呼び出しをラップするかを覚えておく必要がありますので、Optional.ofNullable
または値がnullでないかどうかを確認します。
Optional
Javaの8に追加されましたが、ため、クラスのフィールドとして使用することは推奨されOptional
実装されていないSerializable
(とJavaのシリアライズはアッカ、スパーク、カフカなどのような多くのフレームワークやシステムによってデフォルトの直列エンジンとして使用されています)。
一方Option
非常にしっかりとScalaの標準ライブラリにバインドされています。私の知る限りでは、ないScalaの標準ライブラリのAPIが返すヌルを、しかしOption
、それは使用に推奨されてヌルあなたのScalaのコード内のすべてで。あなたも、それがあればコンパイルに失敗することにプロジェクトを設定することができますnullがされて使用します。
Option
また、あるSerializable
と使用への通常の練習を空にすることができる値のクラスフィールドとしてです。
あなたはJavaコードで同様のアプローチを使用する場合はチェックしてくださいオプションからVavrを。それは安全にフィールドとして使用することができ、それはまた、2つのサブクラスを有しているので、それは、シリアライズ可能だNone
とSome
(同様にScalaのようにOption
、程度)がVavrのパターンマッチングに使用することができます。
Match(option).of(
Case($Some($()), "defined"),
Case($None(), "empty")
);