it-roy-ru.com

Разница между объектом и классом в Scala

Я просто просматриваю некоторые учебники по Scala в Интернете и заметил, что в некоторых примерах объект объявляется в начале примера.

В чем разница между class и object в Scala?

553
Steve

тЛ; др

  • class C определяет класс, как в Java или C++.
  • object O создает singleton object O как экземпляр некоторого анонимного класса; он может использоваться для хранения статических членов, которые не связаны с экземплярами какого-либо класса.
  • object O extends T делает объект O экземпляром trait T; Затем вы можете передать O где угодно, ожидается T.
  • если есть class C, то object C является сопутствующим объектом класса C; обратите внимание, что объект-компаньон not автоматически является экземпляром C.

Также см. Документацию Scala для object и class .

Использование в качестве хоста статических членов

Чаще всего вам нужен object для хранения методов и значений/переменных, которые должны быть доступны без необходимости сначала создавать экземпляр некоторого класса . Это использование тесно связано с членами static в Java.

object A {
  def twice(i: Int): Int = 2*i
}

Затем вы можете вызвать вышеуказанный метод с помощью A.twice(2).

Если бы twice был членом некоторого класса A, то вам сначала нужно создать экземпляр:

class A() {
  def twice(i: Int): Int = 2 * i
}

val a = new A()
a.twice(2)

Вы можете увидеть, насколько это избыточно, так как twice не требует каких-либо специфических для экземпляра данных.

Использование в качестве специального именованного экземпляра

Вы также можете использовать сам object в качестве некоторого особого экземпляра класса или признака . Когда вы делаете это, ваш объект должен расширять некоторую trait, чтобы стать экземпляром его подкласса.

Рассмотрим следующий код:

object A extends B with C {
  ...
}

Это объявление сначала объявляет анонимный (недоступный) класс, который расширяет B и C, и создает экземпляр одного экземпляра этого класса с именем A.

Это означает, что A может передаваться функциям, ожидающим объекты типа B или C, или B with C.

Дополнительные функции object

Существуют также некоторые особенности объектов в Scala. Рекомендую прочитать официальную документацию .

  • def apply(...) включает обычный синтаксис без имени метода A(...)
  • def unapply(...) позволяет создавать пользовательские сопоставления с образцом экстракторы
  • если сопровождающий класс с тем же именем, объект принимает на себя особую роль при разрешении неявных параметров
502
ziggystar

class - это определение, описание. Он определяет тип с точки зрения методов и состава других типов.

object - это singleton - экземпляр класса, который гарантированно будет уникальным. Для каждого object в коде создается анонимный класс, который наследуется от любых классов, которые вы объявили object для реализации. Этот класс не виден из исходного кода Scala - хотя вы можете получить его через рефлексию.

Существует взаимосвязь между object и class. Говорят, что объект является объектом-компаньоном класса, если они имеют одно и то же имя. Когда это происходит, у каждого есть доступ к методам видимости private в другом. Эти методы не импортируются автоматически. Вы должны либо импортировать их явно, либо поставить перед ними префикс имени класса/объекта.

Например:

class X {
  // class X can see private members of object X
  // Prefix to call
  def m(x: Int) = X.f(x)

  // Import and use
  import X._
  def n(x: Int) = f(x)

  private def o = 2
}

object X {
  private def f(x: Int) = x * x

  // object X can see private members of class X
  def g(x: X) = {
    import x._
    x.o * o // fully specified and imported
   }
}
237
Daniel C. Sobral

Объект имеет ровно один экземпляр (вы не можете вызвать new MyObject). Вы можете иметь несколько экземпляров класса.

Объект выполняет то же самое (и некоторые дополнительные) цели как статические методы и поля в Java. 

66
Thomas Jung

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

  • Это может быть сопутствующий объект для class/trait, содержащий то, что можно считать статическими методами или вспомогательными методами.

  • Он может действовать как модуль, содержащий связанные/вспомогательные типы и определения и т.д.

  • Он может реализовать интерфейс путем расширения class или одного или нескольких traits.

  • Он может представлять собой случай sealed trait, который не содержит данных. В этом отношении он часто считается более правильным, чем case class без параметров. Особый случай sealed trait только с разработчиками case object является более или менее Scala-версией перечисления.

  • Он может служить доказательством логики, управляемой implicit.

  • Он вводит одноэлементный тип.

Это очень мощная и общая конструкция. Новичков в Scala может смутить то, что одна и та же конструкция может иметь совершенно разные применения. И object может одновременно обслуживать многие из этих различных видов использования, что может быть еще более запутанным.

17
acjay

Определение объекта в Scala похоже на определение класса в Java, который имеет только статические методы. Однако в Scala объект может расширять другой суперкласс, реализовывать интерфейсы и передаваться, как если бы он был экземпляром класса. (Так что это как статические методы в классе, но лучше).

15
Ken Bloom

Формальная разница - 

  1. вы не можете предоставить параметры конструктора для Объекты
  2. Объект не является типом - вы не можете создавать экземпляр с новым оператором. Но он может иметь поля, методы, расширять суперкласс и смешивать черты. 

Разница в использовании:

  • Scala не имеет статических методов или полей. Вместо этого вы должны использовать object. Вы можете использовать его с или без связанного класса. В первом случае это называется объектом-компаньоном. Ты должен:
    1. используйте одно и то же имя для класса и объекта
    2. поместите их в один и тот же исходный файл. 
  • Для создания программы вы должны использовать метод main в object, а не в class.

    object Hello {
      def main(args: Array[String]) {
        println("Hello, World!")
      }
    }
    
  • Вы также можете использовать его как одноэлементный объект в Java.

     

     

12
irudyak

Ключевое слово object создает новый одноэлементный тип, который похож на class , который имеет только один именованный экземпляр. Если вы знакомы с Java, объявление object в Scala очень похоже на создание нового экземпляра анонимного класса.

Scala не имеет эквивалента ключевому слову static Java, а object часто используется в Scala, где вы можете использовать класс со статическими членами в Java.

4
user2989087

В Scala отсутствует концепция static. Таким образом, scala создает одноэлементный объект, чтобы обеспечить точку входа для выполнения вашей программы .. Если вы не создаете одноэлементный объект, ваш код будет успешно скомпилирован, но не произведет никакого вывода. Методы, объявленные внутри Singleton Object, доступны глобально. Одноэлементный объект может расширять классы и признаки.

Пример объекта Scala Singleton

object Singleton{  
    def main(args:Array[String]){  
        SingletonObject.hello()         // No need to create object.  
    }  
}  


object SingletonObject{  
    def hello(){  
        println("Hello, This is Singleton Object")  
    }  
}  

Результат:

Hello, This is Singleton Object

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

Сопутствующий класс и его сопутствующий объект должны быть определены в одном и том же исходном файле.

Пример объекта Scala Companion

class ComapanionClass{  
    def hello(){  
        println("Hello, this is Companion Class.")  
    }  
}  
object CompanoinObject{  
    def main(args:Array[String]){  
        new ComapanionClass().hello()  
        println("And this is Companion Object.")  
    }  
}  

Результат:

Hello, this is Companion Class.
And this is Companion Object.

В Scala класс может содержать:

1. Член данных

2. Член метод  

3. Блок конструктора  

4. Вложенный класс  

5. Информация о суперклассе и т.д.

Вы должны инициализировать все переменные экземпляра в классе. Там нет области по умолчанию. Если вы не укажете область доступа, она будет общедоступной. Должен быть объект, в котором определен основной метод. Это обеспечивает отправную точку для вашей программы. Здесь мы создали пример класса.

Образец примера Scala класса

class Student{  
    var id:Int = 0;                         // All fields must be initialized  
    var name:String = null;  
}  
object MainObject{  
    def main(args:Array[String]){  
        var s = new Student()               // Creating an object  
        println(s.id+" "+s.name);  
    }  
} 

Извините, я опоздал, но я надеюсь, что это поможет вам.

2
Bhaskar Das

Объект это класс, но у него уже есть (есть) экземпляр, поэтому вы не можете вызвать new ObjectName. С другой стороны, Class это просто тип, и он может быть экземпляром, вызывая new ClassName().

2
Yonggoo Noh

Класс Scala такой же, как класс Java, но Scala не предоставляет какой-либо метод записи в классе, как метод main в Java. Основной метод, связанный с ключевым словом объекта. Вы можете думать о ключевом слове объекта как о создании одноэлементного объекта класса, который определен неявно.

дополнительную информацию смотрите в этой статье ключевое слово class и object в scala-программировании

1
FOD

В некоторых случаях объект равен статическому классу в Java, статические характеристики означают, что статическому классу не нужно создавать объект при помещении в JVM, его можно использовать непосредственно по имени класса

0
David

Если вы исходите из Java, концепция класса в scala отчасти похожа на Java, но класс в scala не может содержать статические члены.

Объекты в scala относятся к одноэлементному типу, в котором вы вызываете методы, используя имя объекта, в scala объект является ключевым словом, а в Java объект является экземпляром класса.

0
Vivek