2015-05-05 2 views
4

я наткнулся на фрагмент кода в Scala, который выглядел так:Scala частная функция

final class Test private (fn: Int => Int) { 
    def square(i: Int) = i * i 
} 

object Test { 
    def apply(fn: Int => Int) = new Test(fn) 
} 

Что это будет означать? Я не мог найти никаких ссылок на это в текстовых материалах, которые у меня есть на Scala.

Edit: Найдено, что я хотел в этой ссылке:

https://www.safaribooksonline.com/library/view/scala-cookbook/9781449340292/ch04s05.html

ответ

4

Это означает Test класс имеет приватный конструктор. Вероятно, он имеет заводские методы в своем сопутствующем объекте.

+0

Вы правы. Исправлен мой ответ. – muhuk

+0

Итак, fn: Int => Int является своего рода избыточным? Что он расскажет внешнему миру? Зачем мне это нужно? – sparkr

+1

Нет, это не избыточно. Возможно, фабричные методы строят функции из других вещей и инициализируют класс с ними. Мы просто догадываемся, пока вы не вставьте все это. – muhuk

3

Это означает, что конструктор private.

Аргументы в объявлении класса используются для обозначения аргументов конструктора.

Чтобы создать такой объект, можно использовать объект-компаньон с заводскими методами.

1

Вы объявляете класс как окончательное средство, вы не можете override Испытательный класс.

И класс тестирования имеет частный конструктор. Поэтому его можно использовать в классе i.e Test

3

Ключевое слово private не относится к классу, а к его конструктору. Это означает, что вы можете использовать класс в любом месте, но не можете его создать с помощью своего конструктора. Однако вы можете создать его с помощью сопутствующего объекта, с помощью применить (или любым другим способом).

Дело в том, что применяется имеет специальный сахар: ().

Это означает, что вы можете создать экземпляр так же, как вы делаете с делом классом:

val t = new Test(f) // won't work 
val t = Test.apply(f) // works 
val t = Test(f) 
+0

Этот ответ является довольно вводящим в заблуждение, так как «apply» не ограничивается возвратом нового экземпляра, а скорее является специально названным методом для обработки объекта, на который он вызывается, как если бы он был функции, следовательно, синтаксического сахара '()'. С другой стороны, создание нового экземпляра не ограничивается методом «apply» сопутствующего объекта, но новые объекты могут создаваться только внутри всего тела класса «Test» или его объекта-компаньона. –

Смежные вопросы