Дополнительный конструктор Scala без параметров плюс параметры конструктора по умолчанию - PullRequest
9 голосов
/ 28 октября 2010

Я использую параметры по умолчанию в конструкторе 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?
    }
}

Мне интересно, есть ли что-то, чего мне не хватает. Есть мысли, которые не требуют дублирования параметров по умолчанию?

Спасибо!

Ответы [ 5 ]

12 голосов
/ 28 октября 2010

Я бы не советовал, но вы можете сделать это, добавив в ваш конструктор еще один параметр:

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

Unit - хороший выбор, потому что в любом случае вы можете передать в него только одну вещьтаким образом, явная передача значения по умолчанию не допускает возможности ошибки, и в то же время позволяет вызывать правильный конструктор.

Если вы хотите реплицировать только один значений по умолчанию, вы можете использовать ту же стратегию, кроме переопределения выбранной по умолчанию, вместо добавления параметра единицы измерения.

4 голосов
/ 29 октября 2010

Вы можете рассмотреть возможность использования фабричного метода:

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

Затем из Java вы можете вызвать MyClass.newDefaultInstance()

Другая возможность - перейти туда, где вы задаете значения по умолчанию:

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

Этот стиль особенно полезен, если вы работаете с фреймворком, таким как Spring, который использует отражение, чтобы найти конструктор 0-arg.

4 голосов
/ 29 октября 2010

Как любопытный обходной хак, и я имею в виду взлом : вы можете использовать внутреннее представление аргументов по умолчанию:

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

Обратите внимание, что необходимо включить MyClass в this (MyClass.init $ default $ 1) . Частичное объяснение состоит в том, что аргументы по умолчанию хранятся в сопутствующих объектах.

0 голосов
/ 09 июня 2017

Если я не ошибаюсь в понимании вопроса, следующий код работает очень хорошо для меня`

class Employee (

   ){
  def this( name :String ,

    eid :Int ){
    this();
  }
}

`

0 голосов
/ 21 февраля 2011

Не подходит для всех целей, но подкласс может помочь:

class DefaultMyClass extends MyClass()
...