0

Guava のOptionalクラスとその正当化を見ていましたが、null であってはならない値を表すときに、同様のクラスがフェイルファストに役立つかどうか疑問に思いました。このアイデアについての議論が見つからないので、ここで質問したいと思いました。

私の最初の試みは、Guava で使用されているスタイルにとどまりMandatory<T>、 static factory を公開しようとしましたof(T t)NullPointerExceptionこのメソッドは、null 引数で呼び出された場合にスローされます。

特に興味があるのは、null 処理に関するインターフェイス メソッドのセマンティクスを突き止めることです。null 引数を受け入れるかどうかは、クライアント コードをそれに応じて設計し、前提条件チェック ロジックの重複を回避できるように、インターフェイスで指定できる設計上の決定であると思います。そのため、このクラスを使用するインターフェースには、次のようなメソッドが含まれる場合があります。

fire(Mandatory<Employee> employee);

そしてクライアントが電話するかもしれません

fire(Mandatory.of(unfortunateEmployee));

そのようなマークされたメソッド引数がnullであってはならないことが絶対に重要である場合、呼び出しの前にさらにチェックをフックするためにアスペクトなどを使用してMandatory型を見つけるのは非常に簡単だと思います。

などの注釈ベースのアプローチも検討しましfire(@NotNull Employee employee)たが、私が見た実装では、バリデーターの追加の配線が必要です。

では、質問は... このアイデアはすでにどこかに存在しますか? そうでない場合、それを弱体化させる明らかな何かを見逃していませんか? またはこれを達成するためのより良いアイデアはありますか?

4

2 に答える 2

6
fire(Mandatory<Employee> employee);

このシグネチャを持つメソッドがあった場合でも、fire(null);を呼び出すことができます。nulltype のMandatory<Employee>代わりに of type を使用するだけですEmployee。実際には安全性はまったく改善されていません。ラッピングの冗長レイヤーを追加しただけです。

パラメーターが必須であることを強制したい場合は、値が null の場合Preconditions.checkNotNullにすぐに a をスローするメソッドの最初のものとしてeg を使用することをお勧めします。NullPointerException

于 2014-01-21T22:33:04.023 に答える
1

NPE をスローする Mandatory.of メソッドを追加する

T 変数を使用すると、すでに NullPointerException がスローされます。

コントラクトの一部としてパラメーターが必要であることを指定する方法は?

これには Javadoc が長い間使用されてきました。

ええ、でもそれを強制したいのです。

あなたはあまりにも多くの時間を手にしています。それはさておき…

@NotNull「新しい道」です。AOP を使用して、目的のメソッドに非 null 検証を自動的に関連付けることができます。以下に、いくつかの優れた実装を示します。

http://blog.solidcraft.eu/2010/09/getting-rid-of-null-parameters-with.html http://janistoolbox.typepad.com/blog/2009/12/aopvalidationnotnull.html

于 2014-01-21T21:37:35.347 に答える