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.