Declarando variáveis no Scala


Vamos colocar a mão na massa agora! Como primeiro assunto, iremos aprender como funciona a declaração de variáveis no Scala. Entre no console do Scala e vamos estudar!

Declaração

[escopo] [tipo da acesso] [nome da variável]: [tipo da variável] = [Valor padrão]

Exemplo:

private val name: String = "Diego"

Essa é a forma completa de declaração, porém não precisamos declarar sempre a forma completa, podemos omitir alguns parâmetros. Mas antes disso iremos entender cada parte da declaração completa. ### 1) Escopo Escopo de acesso da sua variável, podendo ser: #### a) public Será uma variável pública, ou seja, será acessível dentro de sua própria classe, instancias dessa classe e subclasses. Esse é o escopo default na declaração de variável no Scala, então podemos omiti-lo.

class User {
  var name: String = ""
  def getName = name
}

// Aqui criamos uma classe Employee que herda de User
class Employee extends User {
  def getFirstLetter = name(0)
}

val user = new User

user.name = "Diego"

println(user.name)
println(user.getName)

val employee = new Employee

employee.name = "Diego"

println(employee.name)
println(employee.getName)
println(employee.getFirstLetter)

Pontos a observar:

  • Utilizamos extends para herdar uma classe
  • O Scala criou automaticamente os métodos get/set para a variável name
  • Uma instância de User tem acesso ao get/set gerado pelo Scala
  • Uma instância de Employee, que herda de User, também tem acesso ao get/set gerado pelo Scala

b) private

Será uma variável privada, ou seja, somente os métodos da classe em questão terão acesso a ela, nem uma subclasse terá acesso.

class User {
  private var name: String = ""

  def getName = name
  def setName(s: String) = name = s
}

class Employee extends User {
  def getFirstLetter = name(0) // Erro
}

val user = new User

user.name = "Diego" // Erro
user.setName("Diego")

println(user.name) // Erro
println(user.getName)

Pontos a observar:

  • O Scala criou automaticamente os métodos get/set para a variável name somente dentro da classe User
  • Uma instância de User NÃO tem acesso ao get/set gerado pelo Scala
  • A classe Employee, que herda de User, NÃO tem acesso ao get/set gerado pelo Scala
  • Uma instância de Employee, que herda de User, também NÃO tem acesso ao get/set gerado pelo Scala

c) protected

Será uma variável protegida, ou seja, somente poderá ser acessada em sua própria classe ou subclasse. Suas instancias assim como o private não terão acesso a mesma.

class User {
  protected var name: String = ""

  def getName = name
  def setName(s: String) = name = s
}

class Employee extends User {
  def getFirstLetter = name(0)
}

val user = new User

user.name = "Diego" // Erro
user.setName("Diego")

println(user.name) // Erro
println(user.getName)

val employee = new Employee

employee.name = "Diego" // Erro
employee.setName("Diego")

println(employee.name) // Erro
println(employee.getName)
println(employee.getFirstLetter)

Pontos a observar:

  • O Scala criou automaticamente os métodos get/set para a variável name dentro da classe User
  • Uma instância de User NÃO tem acesso ao get/set gerado pelo Scala
  • A classe Employee, que herda de User, tem acesso ao get/set gerado pelo Scala
  • Uma instância de Employee, que herda de User, NÃO tem acesso ao get/set gerado pelo Scala

2) Tipo de acesso

O tipo de acesso definimos se nossa variável é mutável ou imutável, ou seja, quando imutável, temos seu comportamento como uma constante.

a) val

Utilizado para deixar a variável imutável. Uma vez o valor definido, não poderá ser mais alterado.

val name = "Diego"
name = "Nogueira" // Erro
println(name)

b) var

Utilizado para deixar a variável mutável. Podemos definir e re-definir a qualquer momento o valor da variável.

var name = "Diego"
name = "Nogueira"
println(name)

Qual devemos utilizar?

Devemos tentar utilizar ao máximo o val, assim nos beneficiaremos da programação funcional, que é um dos pontos fortes da linguagem, além de ser extremamente recomendado pela comunidade do Scala.

3) Nome da variável

Nome da variável em questão. Devemos ficar atentos aos nomes das variáveis em nossa aplicação, utilize sempre nomes façam sentido para as quais as variáveis foram criadas. Caso o nome de uma variável seja muito grande, você pode abreviar, mas sempre mantendo a coesão.

4) Tipo da variável

Assim como em outras linguagens, o Scala possui todos os tipos padrões: String, Int, Double, Boolean entre muitos outros. Além do benefício de podermos utilizar variáveis do Java:

val name: String = "Diego"
name.getClass

val total: Int = 100
total.getClass

val closed: Boolean = true
closed.getClass

val name: java.lang.String = "Diego"
name.getClass

Quando o tipo da variável for omitido, o Scala irá atribuir um tipo baseando-se no valor que foi passado.

val name = "Diego"
name.getClass

val total = 100
total.getClass

val price = 1.0
price.getClass

val closed = true
closed.getClass

4) Valor padrão

Por último, podemos informar algum valor padrão para nossa variável. Note que caso a variável seja declarada utilizando o val, esse será seu valor único, pois variáveis declaradas com val não podem ser alteradas.

Declaração múltipla

Podemos definir várias variáveis ao mesmo tempo e informando um valor padrão pra elas também.

val variable1, variable2 = 100

Lazy (variável preguiçosa)

Um recurso bastante interessante é o lazy, quando informado na declaração de uma variável, faz com que o valor padrão somente seja executado no momento da primeira chamada a variável. Vamos ver como funciona:

Sem lazy

val numbers = for(i <- 1 to 10) yield i
for(e <- numbers) println(e)

Repare que no momento que declaramos a variável numbers, automaticamente foi criado um vetor com o retorno do nosso loop for. Agora iremos criar o mesmo exemplo utilizando o lazy.

Com lazy

lazy val numbers = for(i <- 1 to 10) yield i
for(e <- numbers) println(e)

Agora utilizando lazy, somente foi processado nosso loop for no momento em que chamamos a variável. Isso é bastante útil, pois pode evitar um processamento desnecessário.

Bem, acho que é isso aí! Até o próximo post!