Scala конструктор без параметров - PullRequest
13 голосов
/ 29 июля 2011

У меня здесь может быть глупая проблема ... Я не могу понять, как создать конструктор без параметров в Scala.Я знаю, что могу просто написать все это в теле класса (особенно потому, что это единственный конструктор, который мне нужен), но это не совсем правильно.

Что у меня есть:

    class Foo {
        //some init code

        //...
    }

Что я хотел бы (но не работает, так как хочет, чтобы я сначала вызвал другой конструктор):

    class Foo {
        // The only constructor
        def this() = { 
            //some init code
        }

        //...
    }

Ответы [ 4 ]

20 голосов
/ 29 июля 2011

Все классы в Scala имеют первичный конструктор и, необязательно, некоторые вспомогательные конструкторы (которые должны относиться к первичному конструктору или другому вспомогательному конструктору).

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

// Primary constructor takes a String
class Foo(s: String) {
    // Auxiliary constructor also takes a String?? (compile error)
    def this(a: String) {
        this(a)
    }
}

Это не имеет ничего общего с тем фактом, что конструктор без аргументов; например, следующие компиляции:

class Foo(s: String) {
    // alternative no-arg constructor (with different signature from primary)
    def this() {
        this("Default value from auxiliary constructor")
    }
}

В частности, в вашем втором примере ваш комментарий «единственный конструктор» - неправильно . Вспомогательные конструкторы всегда вторичны по отношению к первичному конструктору и не могут быть единственным конструктором.

FWIW, первый пример - единственный вариант, открытый для вас, но он выглядит хорошо для меня. Если вы только начали использовать Scala, я уверен, что он скоро начнет чувствовать себя правильно - и важно избегать Java-esque способов ведения дел, когда есть более идиоматические альтернативы.

12 голосов
/ 29 июля 2011

Для чего это стоит, вы можете ввести дополнительную область для «маркировки» кода инициализации.

class Foo {
   {
      // init code here
   }
}
4 голосов
/ 29 июля 2011

Код инициализации - это тело метода. Но вы можете сделать это, если вам все это так сильно мешает:

class Foo {
        locally { 
            //some init code
        }
}
4 голосов
/ 29 июля 2011

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

class Foo {

  private def init {
    //init code here
  }

  init()
}

это так близко, как вы собираетесь получить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...