Scala Rocks #1 – Adicionando métodos a classes existentes (Scala 2.10+)

Em um projeto é comum você precisar adicionar um comporamento a uma classe somente dentro de um determinado contexto.
Por exemplo suponha que você precisa verificar se um número inteiro é primo. Basta chamar o método isPrime

object main {

  def main(args: Array[String]) {

    println (100.isPrime)
    println (3.isPrime)
    println (7 isPrime)
    println (122 isPrime)

  }

}

A compilação do código acima falha porque na verdade não existe o método isPrime na classe Int. Você não pode extender Int para adicionar este comportamento (nem seria recomendável) já que, assim como no Java, Int é final.
No Scala 2.10+ uma funcionalidade que permite adicionar métodos a uma classe existente. São as implicit classes.

Vamos declarar uma implict class:

object NumericTools {
  
  implicit class CheckPrime(integer: Int) {

    def isPrime = ! ((2 until integer-1) exists (integer % _ == 0))

  }

}

Agora importando a NumericTools no namespace todos o objetos do tipo Int dentro do escopo vão ganhar este comportamento:

object main {

  def main(args: Array[String]) {

  import NumericTools._

    println (100.isPrime)
    println (3.isPrime)
    println (7 isPrime)
    println (122 isPrime)

  }

}

false
true
true
false

Como vocês podem ver acima a implicit class precisa ser declarada dentro de um object, package object, ou class.

A vantagem de usar dessa forma em vez de simplesmente criar uma classe Helper como fazemos no Java é que você pode criar mini DSL´s tornando seu código mais semântico.

Até a próxima.

Leave a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *