Scala - достаточно ли занятий? - PullRequest
7 голосов
/ 27 июня 2010

Исходя из Java, меня смущает различие классов / объектов в scala. Обратите внимание, что я не прошу формальной разницы; достаточно ссылки в Интернете, которые объясняют это, и есть связанные вопросы по SO .

Мои вопросы:

  1. Почему разработчики скала решил сделать вещи более сложный (по сравнению с Java или C #)? Какие недостатки я должен ожидать, если я проигнорирую это различие а объявлять только классы?

Спасибо.

Ответы [ 3 ]

23 голосов
/ 27 июня 2010

Java-классы содержат два совершенно разных типа членов - члены экземпляра (например, BigDecimal.plus) и статические члены (например, BigDecimal.valueOf). В Scala есть только членов экземпляра. Это на самом деле упрощение! Но это оставляет проблему: куда мы помещаем методы типа valueOf? Вот где полезны объекты.

class BigDecimal(value: String) {
   def plus(that: BigDecimal): BigDecimal = // ...
}

object BigDecimal {
   def valueOf(i: Int): BigDecimal = // ...
}

Вы можете рассматривать это как объявление анонимного класса и его единственное создание:

class BigDecimal$object {
   def valueOf(i: Int): BigDecimal = // ...
}
lazy val BigDecimal = new BigDecimal$object

При чтении кода Scala важно различать типы и значения. Я настроил IntelliJ для подсветки синего цвета.

val ls = List.empty[Int]  // List is a value, a reference the the object List
ls: List[Int]             // List is a type, a reference to class List

У Java также есть другая степень сложности, которая была удалена в Scala - различие между полями и методами. Поля не допускаются на интерфейсах, кроме случаев, когда они являются статическими и конечными; методы могут быть переопределены, поля вместо этого скрыты, если переопределены в подклассе. Scala устраняет эту сложность и предоставляет методы только программисту.

Наконец, быстрый ответ на ваш второй вопрос: если вы не объявляете какие-либо объекты, ваша программа может никогда не запуститься, так как для определения эквивалента public static void main(String... args) {} в Scala вам нужен хотя бы один объект!

2 голосов
/ 27 июня 2010

Scala не имеет представления о статических методах со стандартными классами, поэтому в этих сценариях вам придется использовать объекты. Интересная статья, которая дает хорошее введение:

http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-3

(прокрутите вниз до вида статики Scala)

0 голосов
/ 13 декабря 2013

Один из способов взглянуть на это - это.Исполняющая программа состоит из сообщества объектов и потоков.Потоки выполняют код в контексте объектов - то есть всегда есть объект "this", внутри которого выполняется поток.Это упрощение от Java в том смысле, что в Java не всегда есть «это».Но сейчас есть проблема курица / яйцо.Если объекты создаются потоками, а потоки выполняются внутри объектов, то какой объект является первым потоком, первоначально выполняемым внутри.Должен быть непустой набор объектов, которые существуют в начале выполнения программы.Это объекты, объявленные с ключевым словом object.

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