Pertanyaan Scala apa perbedaan antara mendefinisikan metode di kelas bukan pada objek pendamping


Saya memiliki keraguan tentang apa perbedaan antara dua bagian kode ini.

Yang jelas adalah bahwa jika metode ditulis dalam kelas Anda harus memberi contoh kelas, sementara jika berada dalam objek pendamping, Anda tidak diharuskan melakukan itu.

Namun, apakah ada juga perbedaan lain? Apakah manfaat dan kerugiannya?

mendefinisikan metode di kelas

class Hello {
  def hello = println("Hello world")
}

object Hello {
  def main(args: Array[String]) {
    val instance = new Hello()
    instance.hello
  }
}

menentukan metode di objek pendamping

class Hello {

}

object Hello {

  def hello = println("Hello world")

  def main(args: Array[String]) {
    this.hello
  }
}

5
2017-11-17 01:29


asal


Jawaban:


Jika Anda ingat bahwa Scala berasal dari Jawa, mungkin akan lebih masuk akal. Di Jawa, hanya ada kelas, dan itu ada static metode, yang tidak bergantung pada bidang apa pun dalam suatu instance (tetapi dapat membaca static bidang) dan metode reguler (non-statis, tingkat-instance). Perbedaannya adalah antara "fungsi yang umum untuk SomeType tetapi untuk tidak ada contoh khususnya", dan "fungsi yang membutuhkan keadaan contoh tertentu". Yang pertama adalah static metode di Jawa, dan yang terakhir adalah metode instan. Di Scala, semua static bagian harus masuk dalam object, dengan tingkat instance val dan def berada di kelas. Sebagai contoh:

object MyNumber {
    // This does not depend on any instance of MyNumber
    def add(c: Int, b: Int): Int = c + b
}
class MyNumber(a: Int) {
    // This depends on an instance of MyNumber
    def next: Int = a + 1
}

7
2017-11-17 01:53