Статьи

Scala Snippet: объект, сопутствующий объект и статические методы

Если вы Java-разработчик, переходящий на Scala, одно существенное отличие в терминологии, которое может вызвать путаницу, — это термин «объект». В Java объект всегда является экземпляром класса, созданным путем вызова конструктора.

объект

В Scala объект используется для определения одного экземпляра класса с нужными вам функциями.

На практике это означает, что вы будете использовать его:

  • хранить служебные / вспомогательные методы и константы в одном месте
  • иметь один неизменный экземпляр для совместного использования в системе
  • реализовать шаблон проектирования Singleton для координации действий в системе

Объект может иметь те же функции, что и класс. Вы можете расширить другие классы или черты. Единственное заметное отличие состоит в том, что объект не может иметь параметров конструктора.

Сопутствующий объект

В Java могут быть случаи, когда вы хотите использовать статические методы.

В Scala вы определяете эти методы внутри «объекта-компаньона», который должен быть определен в том же исходном файле, что и класс.

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

Оформить заказ в этом примере:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$ scala
Welcome to Scala version 2.11.4 (Java HotSpot(TM) Client VM, Java 1.7.0_75).
Type in expressions to have them evaluated.
Type :help for more information.
 
scala> :paste
// Entering paste mode (ctrl-D to finish)
 
  object Camera {
    def updateShutterCount(shutterCount:Long): Long = {
      var updatedShutter = shutterCount + 1;
      updatedShutter
    }
  }
 
  class Camera(brandName:String, modelName:String) {
    val brand = brandName;
    val model = modelName;
    var shutterCount: Long = 0;
 
    def makePicture {
      shutterCount = Camera.updateShutterCount(shutterCount)
    }
  }
 
// Exiting paste mode, now interpreting.
 
defined object Camera
defined class Camera
 
scala> val canon = new Camera("Canon", "5D mark III")
canon: Camera = Camera@17403a7
 
scala> canon.shutterCount
res0: Long = 0
 
scala> canon.makePicture
 
scala> canon.shutterCount
res2: Long = 1

Как вы можете видеть, я использовал «статический» метод из объекта-компаньона для обновления значения shuttercount при вызове метода makePicture на моей canon Camera.

Наконец, одноэлементный объект, который не разделяет одно и то же имя с сопутствующим классом, называется автономным объектом .