9

コンストラクターで Scala 2.8 のデフォルト パラメーターを使用していますが、Java 互換性の理由から、デフォルト パラメーターを使用する引数なしのコンストラクターが必要でした。

これは非常に賢明な理由で機能しません。

class MyClass(field1: String = "foo", field2: String = "bar") {
    def this() = {
        this() // <-- Does not compile, but how do I not duplicate the defaults?
    }
}

足りないものがあるかどうか疑問に思っています。パラメータのデフォルトを複製する必要がないという考えはありますか?

ありがとう!

4

5 に答える 5

12

あまりお勧めしませんが、コンストラクターに別のパラメーターを追加することで実行できます。

class MyClass(a: String = "foo", b: String = "bar", u: Unit = ()) {
  def this() { this(u = ()) }
}

Unitとにかく 1 つしか渡すことができないため、デフォルト値を明示的に渡すことでエラーが発生する可能性がなくなり、正しいコンストラクターを呼び出すことができるため、良い選択です。

デフォルトの1 つだけを複製する場合は、ユニット パラメータを追加する代わりに、選択した 1 つのデフォルトをオーバーライドすることを除いて、同じ戦略を使用できます。

于 2010-10-28T18:28:17.197 に答える
4

好奇心をそそる回避策として、ハックを意味します。デフォルトの引数の内部表現を使用できます。

class MyClass(field1: String = "foo", field2: String = "bar") { 
  def this() =  this(MyClass.init$default$1)
}

this(MyClass.init $ default $ 1)にMyClassを含める必要があることに注意してください。部分的な説明は、デフォルトの引数がコンパニオンオブジェクトに保持されていることです。

于 2010-10-29T01:28:04.827 に答える
4

ファクトリメソッドの使用を検討してください。

class MyClass(field1: String = "foo", field2: String = "bar")
object MyClass {
    def newDefaultInstance = new MyClass
}

次に、Javaから呼び出すことができますMyClass.newDefaultInstance()

もう1つの可能性は、デフォルト値を指定した場所に移動することです。

class MyClass(field1: String, field2: String) {
  def this() = this(field1="foo", field2="bar")
}

このスタイルは、リフレクションを使用して0引数のコンストラクターを見つけるSpringなどのフレームワークを使用している場合に特に便利です。

于 2010-10-29T08:32:49.817 に答える
0

私が質問を理解するのに間違っていなければ、次のコードは私にとって非常にうまくいきました`

class Employee (

   ){
  def this( name :String ,

    eid :Int ){
    this();
  }
}

`

于 2017-06-09T13:58:04.963 に答える
0

すべての目的に適しているわけではありませんが、サブクラスでうまくいくかもしれません:

class DefaultMyClass extends MyClass()
于 2011-02-21T20:54:55.130 に答える