tempo de leitura: 4 minutos
a fim de compreender o uso de objetos companheiros, é importante entender os membros estáticos em primeiro lugar. Aprendemos que em linguagens orientadas a objetos, As classes são o modelo que contém membros como campos e métodos. Mas para acessar esses campos ou métodos, primeiro precisamos construir os objetos a partir dessas classes.
vamos olhar para um exemplo.
class Math { private val max = 100 def sum(a: Int, b: Int): Int = a + b}object Test { def main(args: Array): Unit = { val math = new Math() math.sum(5, 10) }}
criámos uma classe chamada matemática com um método chamado soma, que recebe dois números e devolve a soma como resultado.
a fim de executar este código, criamos uma instância desta classe Matemática e invocamos o método sum contornando 5 e 10, recebendo 15 como resultado. No entanto, como vemos, o método da soma não depende de nenhuma das variáveis-membro da classe Matemática.
por exemplo, a variável Max member neste caso. Então, não deve haver necessidade de criar uma instância de classe Matemática para invocar o método sum. Devemos poder chamar isto directamente neste caso. E é aqui que os objetos companheiros entram na imagem.
há quatro coisas que temos que lembrar sobre objetos companheiros:
1. Eles compartilham o mesmo nome que a classe correspondente.
2. Eles começam com a palavra-chave” objeto”.
3. Eles vivem no mesmo arquivo fonte que as classes correspondentes.
4. Os objetos companheiros e as classes correspondentes agem como membros privados um do outro.
a palavra-chave” objeto ” diz que este é um objeto singleton. Em outras palavras, Isso significa que enquanto o seu programa está em execução, você pode criar quantas instâncias de suas aulas você quiser, mas o objeto singleton seria apenas uma, e não haverá várias instâncias dele.
vamos vê-los em ação usando o nosso exemplo matemático.
object Math { def sum(a: Int, b: Int): Int = a + b def getPrivateMember: Int = = new Math().max}class Math { private val max = 100}object Test { def main(args: Array): Unit = { Math.sum(5, 10) Math.getPrivateMember }}
como vemos, criámos um novo objecto singleton chamado Math, que tem o mesmo nome que a nossa classe Math. Ele também começa com a palavra-chave” objeto ” e permanece no mesmo arquivo que a matemática de classe.
movemos a implementação para a soma da classe para o seu objeto companheiro. Isto porque, como sabemos que a implementação da soma não depende das variáveis-membro para a classe Matemática, colocar essa implementação no objeto companheiro ajudará os chamadores a não criar a instância da classe Matemática e chamá-la diretamente.
há outro método que temos escrito para mostrar que o objeto companheiro tem acesso aos membros privados de sua classe.
aqui, o getprivatemember inicia a classe Matemática e devolve-lhe um membro privado chamado “max”. Há uma coisa adicional a notar aqui. Quando definimos o get prevatemember, nós não colocamos os parênteses. Em Scala, existe uma convenção na qual, se o método não tem argumentos a tomar e não realiza nenhum efeito colateral, o que significa que é uma função pura, podemos optar por omitir os parênteses.
Here, getPrivateMember is just returning the value of the member variable, so we choose to omit the parentheses.
Math.sum(5, 10)Math.getPrivateMember
When we execute the sum method, we executed it from the Math companion object and did not have to create the new instance of Math class. Além disso, fomos capazes de Acessar a variável membro privado da classe Matemática a partir do objeto companheiro.
Criar Objetos Usando Aplicar
sabemos que para criar uma nova instância de um objeto, precisamos usar a “nova” palavra-chave.
por exemplo:
class Person(firstName: String, lastName: String) {def getName: String = firstName + lastName}object Test { def main(args: Array): Unit = { val alice = new Person("Alice", "Christy") }}
we have a class called “Person” with the firstName and lastName as class parameters. E criamos um novo exemplo de pessoa como mostrado acima. Nós criamos “alice” como uma nova pessoa, passando no primeiro nome e no último nome.
no entanto, em Scala, há mais uma maneira de criar objetos sem usar a nova palavra-chave.
há um método chamado “aplicar” em objeto companheiro que é tratado especialmente pelo compilador Scala, e nos permite criar novas instâncias de classes sem exigir a nova palavra-chave. Vamos aprender a usá-lo no nosso código.
object Person { def apply(firstName: String, lastName: String): Person = new Person(firstName, lastName)}class Person(firstName: String, lastName: String) { def getName: String = firstName + " " + lastName}object Test { def main(args: Array): Unit = { val alice = Person("Alice", "Christy") println(p.getName) }}
como vemos aqui, criamos um objeto companheiro com método de Aplicação nele. Leva os argumentos que precisamos para criar uma instância de pessoa de classe, cria a instância de pessoa internamente, e retorna a instância. Como vemos, criamos a instância da classe de pessoa sem usar a nova palavra-chave. E podemos aceder aos membros como qualquer outro objecto. 🙂
isso é tudo sobre objeto companheiro deste blog. Continua A Aprender, Continua A Crescer!!!