私はコンストラクタの引数をチェックし、引数のセットが有効でない場合(値が期待される制約に収まらない場合)、IllegalArgumentException
をスローするのを拒否したいと思います。これをScalaでコーディングするには?コンストラクタの引数をチェックし、例外をスローするか、またはスキャラのデフォルトのコンストラクタでアサーションを作成する方法はありますか?
答えて
Scalaでは、クラス全体が主なコンストラクタであるため、そこで検証ロジックを追加できます。
class Foo(val i: Int) {
require(i >= 0, "the number must be non-negative.")
}
より良いアプローチを投げるのscalaz.Validation[String, Foo]
を代わりに与えファクトリメソッドを提供するために、次のようになります。
scala> class Foo(val i: Int) {
| if(i < 0)
| throw new IllegalArgumentException("the number must be non-negative.")
| }
defined class Foo
scala> new Foo(3)
res106: Foo = [email protected]
scala> new Foo(-3)
java.lang.IllegalArgumentException: the number must be positive.
Scalaは次のようにあなたがより簡潔同じ事を書き込むことができますユーティリティメソッドrequire
を提供します例外。 (注:Scalazが必要)
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Foo private(val i: Int)
object Foo {
def apply(i: Int) = {
if(i < 0)
failure("number must be non-negative.")
else
success(new Foo(i))
}
}
// Exiting paste mode, now interpreting.
defined class Foo
defined module Foo
scala> Foo(3)
res108: scalaz.Validation[java.lang.String,Foo] = Success([email protected])
scala> Foo(-3)
res109: scalaz.Validation[java.lang.String,Foo] = Failure(number must be non-negative.)
scala> class Foo(arg: Int) {
| require (arg == 0)
| }
defined class Foo
scala> new Foo(0)
res24: Foo = [email protected]
scala> new Foo(1)
java.lang.IllegalArgumentException: requirement failed
ニース!質問に対する完全な答え。 'require'がどのように機能するかの詳細について少し詳しく説明できますか? –
これは、 'require'作業を行う方法です。@ dan-burton ;-) http://pastebin.com/rJQfTCX9引数がfalseの場合、' new IllegalArgumentException( "requirement failed") 'をスローします。例外を自分自身で投げるのではなく、 'require'を使う考えは、あなたのコードをよりきれいにし、静的解析(これはまだ実装されていないようです)に適したものにすることです。 – Ivan
- 1. Javaの引数のないコンストラクタ:不可能な例外をスローするか、空のキャッチブロックがありますか?
- 2. コンストラクタはJavaで例外をスローできますか?
- 3. コンストラクタはデフォルトのコンストラクタを生成していますか?
- 4. Pythonのプラクティス:コンストラクタのパラメータをチェックする良い方法はありますか?
- 5. 引数でコンストラクタを明示的に定義すると、デフォルトのコンストラクタが作成されますか?
- 6. エラー:このクラスはデフォルトのコンストラクタ(引数のないpublicコンストラクタ)を提供する必要があります
- 7. コンストラクタは新しい例外をスローしませんか?
- 8. デフォルトのコンストラクタはありませんか?
- 9. Angular2、コンストラクタDI例外をスローする
- 10. コンストラクタとスロー例外
- 11. 引数をオブジェクトの正しいコンストラクタに渡す引数の数を可変にしてテンプレート関数を作成する方法はありますか?
- 12. EJB3コンストラクタが例外をスローしますか?
- 13. QLineEditsをコンストラクタまたはメソッドで作成する必要がありますか?
- 14. .NETのコンストラクタから例外をスローする
- 15. コンストラクタの関数がコンストラクタの関数が完了しなくなるまでコンストラクタの後のコンポーネントのライフサイクルを保持する方法はありますか?
- 16. C++では、デフォルトの引数だけを持つコンストラクタは、デフォルトのコンストラクタですか?次のコードで
- 17. このユニットテストで "N"例外をスローする方法はありますか?
- 18. C++でコンストラクタから例外をスローする
- 19. 例外をスローするのではなく整数の値を修正する方法はありますか?
- 20. 例外が発生したコンストラクタの失敗をチェックする方法
- 21. CustomDeserializerにデフォルトの(引数なし)コンストラクタがありません
- 22. チェーンオーバーロードされたコンストラクタでスロー例外をどこに配置しますか?
- 23. コンストラクタが例外をスローすると、どのデストラクタが実行されますか?
- 24. Nimコンストラクタを定義する方法はありますか?
- 25. DLL境界を越えてコンストラクタから例外をスローする
- 26. 例外をスローするかどうかを見るためにコンストラクタを嘲笑
- 27. Spring MVCのデフォルトまたは引数なしのコンストラクタ
- 28. コンストラクタの例外をキャッチするには?
- 29. 特定の引数を取るコンストラクタを要求する方法はありますか?
- 30. コンストラクタの例外または投げ込みですか?
+1良い説明 –
は貼り付けモードについて知りませんでした。+1: – wbarksdale
これは、Scalaが偉大な言語であることを意味します。 – Pooya