DEV Community

Referências a métodos de instância

  • Definição: Uma referência a um método de instância é criada com a seguinte sintaxe:

refObj::nomeMétodo

  • Diferença de métodos estáticos: Em vez de usar o nome de uma classe, utiliza-se uma referência de objeto.

  • Comportamento: O método referenciado opera em relação ao objeto específico (refObj).

Exemplo:

  • Reutilização da interface:
    Interface IntPredicate e método test() são usados novamente.

  • Nova classe criada:
    Nome: MyIntNum.

  • Responsabilidade:
    Armazena um valor inteiro.
    Define o método isFactor() para verificar se um número é fator do valor armazenado.

  • Execução no main():
    Instâncias: Duas instâncias de MyIntNum são criadas.

  • Referência de método:
    numTest() é chamado passando uma referência ao método isFactor() e o número a ser testado.
    A referência funciona com relação ao objeto específico.

// Usa uma referência a um método de instância.
// Interface funcional para predicados numéricos que opera com
// valores inteiros.
interface IntPredicate {
boolean test(int n);
}
// Esta classe armazena um valor int e define o método de
// instância isFactor(), que retorna true quando seu argumento
// é fator do valor armazenado.
class MyIntNum {
private int v;
MyIntNum(int x) { v = x; }
int getNum() { return v; }
// Retorna true se n for fator de v.
boolean isFactor(int n) {
return (v % n) == 0;
}
}
class MethodRefDemo2 {
public static void main(String args[])
{
boolean result;
MyIntNum myNum = new MyIntNum(12);
MyIntNum myNum2 = new MyIntNum(16);
// Aqui, uma referência ao método isFactor é criada em myNum.
IntPredicate ip = myNum::isFactor;
// Agora, ela é usada para chamar isFactor() via test().
result = ip.test(3);
if(result) System.out.println("3 is a factor of " + myNum.getNum());
// Desta vez, uma referência ao método isFactor é criada em myNum2.
// e usada para chamar isFactor() via test().
ip = myNum2::isFactor;
result = ip.test(3);
if(!result) System.out.println("3 is not a factor of " + myNum2.
getNum());
}
}

Referência de Método para um Objeto Específico

IntPredicate ip = myNum::isFactor;

  • A referência de método ip aponta para o método de instância isFactor() no objeto myNum.

  • Ao chamar ip.test(3), o método isFactor() é executado em myNum.

  • Outra referência como myNum2::isFactor funciona da mesma forma, mas opera em myNum2.

Referência de Método para Qualquer Objeto de uma Classe

NomeClasse::nomeMétodoInstância

  • O nome da classe é usado para referenciar um método de instância aplicável a qualquer objeto dessa classe.

  • O primeiro parâmetro da interface funcional se torna o objeto chamador do método.

  • Interface: MyIntNumPredicate

  • Método: test(MyIntNum obj, int value)

  • Permite usar a referência MyIntNum::isFactor para qualquer objeto da classe MyIntNum.

// Usa uma referência de método de instância para referenciar
// qualquer instância.
// Interface funcional para predicados numéricos que opera com um
// objeto de tipo MyIntNum e um valor inteiro.
interface MyIntNumPredicate {
boolean test(MyIntNum mv, int n);
}
// Esta classe armazena um valor int e define o método
// de instância isFactor(), que retorna true quando seu
// argumento é fator do valor armazenado.
class MyIntNum {
private int v;
MyIntNum(int x) { v = x; }
int getNum() { return v; }
// Retorna true se n for fator de v.
boolean isFactor(int n) {
return (v % n) == 0;
}
}
class MethodRefDemo3 {
public static void main(String args[])
{
boolean result;
MyIntNum myNum = new MyIntNum(12);
MyIntNum myNum2 = new MyIntNum(16);
// Esta instrução faz inp referenciar o método de
// instância isFactor().
// Referência de método para qualquer objeto de tipo MyIntNum
MyIntNumPredicate inp = MyIntNum::isFactor;
// A instrução a seguir chama isFactor() em myNum.
result = inp.test(myNum, 3);
if(result)
System.out.println("3 is a factor of " + myNum.getNum());
// A próxima instrução chama isFactor() em myNum2.
result = inp.test(myNum2, 3);
if(!result)
System.out.println("3 is a not a factor of " + myNum2.getNum());
}
}

Observe: MyIntNumPredicate inp = MyIntNum::isFactor;

  • A referência ao método de instância isFactor() permite que ele funcione com qualquer objeto do tipo MyIntNum.

  • test() é chamado através da referência, como em inp.test(myNum, 3), isso resulta em uma chamada a myNum.isFactor(3), onde myNum é o objeto no qual o método é executado.

Top comments (0)