Давайте начнем с «Синглтон-паттерна» :
object SomeSingleton //That's it
Я бы дополнительно предложил "Использование функций высшего порядка" .
Вместо е. г. перебирая коллекцию самостоятельно, вы предоставляете функции методам, которые предоставляют классы.
В Scala вы в основном говорите, что намереваетесь делать:
//declare some example class
case class Person(name: String, age: Int)
//create some example persons
val persons = List(Person("Joe", 42), Person("Jane", 30), Person("Alice", 14), Person("Bob", 12))
//"Are there any persons in this List, which are older than 18?"
persons.exists(_.age > 18)
// => Boolean = true
//"Is every person's name longer than 4 characters?"
persons.forall(_.name.length > 4)
// => Boolean = false
//"I need a List of only the adult persons!"
persons.filter(_.age >= 18)
// => List[Person] = List(Person(Joe,42), Person(Jane,30))
//"Actually I need both, a list with the adults and a list of the minors!"
persons.partition(_.age >= 18)
// => (List[Person], List[Person]) = (List(Person(Joe,42), Person(Jane,30)),List(Person(Alice,14), Person(Bob,12)))
//"A List with the names, please!"
persons.map(_.name)
// => List[String] = List(Joe, Jane, Alice, Bob)
//"I would like to know how old all persons are all together!"
persons.foldLeft(0)(_ + _.age)
// => Int = 98
Выполнение этого в Java означало бы касаться элементов коллекции самостоятельно и смешивать логику вашего приложения с кодом управления потоком.
Дополнительная информация о классах Коллекции.
Эта замечательная бумага EPFL о Может быть интересна и модель наблюдений .
Классы типов - это один из подходов к структурированию общих свойств классов, где наследование на самом деле не подходит.