sábado, 15 de abril de 2017

Un resumen de Scala for the Impatient, parte 16


Objetos

scala no tiene campos o métodos estáticos, en cambio se pueden usar los objetos. Estos son objetos que solo tienen una instancia (similar a los singletons) y contienen atributos y métodos. Veamos un ejemplo:

object Accounts {
private var lastNumber = 0
def newUniqueNumber() = { lastNumber += 1; lastNumber }
}

Cuando necesita una único numero de cuenta puede llamar a Accounts.newUniqueNumber()

El constructor de un objeto es ejecutado cuando el objeto es utilizado por primera vez. En el ejemplo el constructor es ejecutado cuando se llame Accounts.newUniqueNumber(). Si este objeto no es utilizado, el constructor no es ejecutado.

Se debería utilizar objetos de scala cuando en java o c++ usábamos singleton.
Esto tiene mayores utilidades que los singletons y es más facil de usar :
  • Se puede utilizar como una clase útil que contiene funciones.
  • No tenemos los problemas del singleton, cuando quiere ser accedido por varios hilos.
  • Se puede utilizar para exponer servicios.

Objetos compañeros.

En Java o c++ podemos poner en la misma clase métodos y propiedades y/o métodos y propiedades estáticas. Pero en scala esto no es posible, por lo tanto podemos hacer objetos con el mismo nombre de la clase y este va contener métodos y propiedades de forma que funcionen como si fueran estáticos.

class Account {
val id = Account.newUniqueNumber()
private var balance = 0.0
def deposit(amount: Double) { balance += amount }
...
}

object Account { // The companion object
private var lastNumber = 0
private def newUniqueNumber() = { lastNumber += 1; lastNumber }
}

El objeto y la clase pueden acceder a propiedades privadas pero deben estar en el mismo archivo.

Objetos que extienden de una Clase o un Rasgo (Trait)

Un objeto puede extender de una clase o uno o más Rasgos o Traits. El resultado es un objeto de una clase que extiende la clase dada y / o rasgos, y además tiene todas las características especificadas en la definición del objeto.

Una aplicación útil es especificar objetos predeterminados que se pueden compartir. Por ejemplo, considere una clase para acciones que se pueden deshacer en un programa.

abstract class UndoableAction(val description: String) {
def undo(): Unit
def redo(): Unit
}

Por defecto el objeto que no hace nada, puede ser un objeto ya que no debemos instanciarlo varias veces:

object DoNothingAction extends UndoableAction("Do nothing") {
override def undo() {}
override def redo() {}
}

DoNothingAction puede ser usado como acción por defecto.