Delegate em JAVA

12 respostas
M

Estou estudando JAVA e surgiu a dúvida se existe algo parecido com delegate do .net em java. Na verdade nem programo .net, estou estudando java e um amigo me explicou sobre o delegate e surgiu a dúvida se existe algo parecido em java. Com isso surgiu algumas necessidades, para ilustar imagine uma interface e varias classes que implementa essa classe, até ai ok! É possivel de alguma forma instanciar essa interface e consumir um metodo, e ao consumir esse metodo todos os metodos das classes que sobrecarregaram esse metodo pela implementação serem chamado???

Sei que não é possivel instanciar uma interface, mas da pra se dizer que com delegate tem se mais ou menos esse efeito, ou seja instancia uma classe e consome um metodo que chama todos metodos que assinam essa classe.

Um exemplo seria uma classe A que esta ligada 3 outras classes, imagine que ao realizar um pedido todas as outras 3 tem que ser avisadas, então um metodo da A sendo chamado ele chama todos metodos das outras 3 classes, e assim posso aumentar e diminuir as classes que interagem com A sem ter que mexer na classe A. Ou seja queria uma solução sem ser as opções mais logica que seria reescrevendo o codigo para incluir uma nova chamada a cada vez que uma classe for inclusa para interagir com A.

Grato

12 Respostas

S

Nunca vi uma palavra chave ou reservada que se aproxime do que você falou :wink:

L

Boa tarde!

Bem,

Quando eu lei a palavra “Delegate” me vem em mente… Business Delegate.

Mas pelo que entendi, você deve estar procurando o padrão Observer !

Espero ter ajudado.

B

esquecendo sua pergunta pelo que acabei de ler em um site esse delegate de .net nao passa de listener em Java.

(deus pra que criar um modificador pra isso)

M

não existe ainda…mas existem planos para isso, de um procurada por “java closures”

M

Obrigado a todos, inclusive vou estudar mais “Observer” que o LeoMarola indicou parece ser interessante!

Então como objeto de estudo fiz algo parecido:

Interface que todas novas classe terão que implementar antes de interagir com a Delegate:

package Delegate;

public interface Interface {
	
   public void grava_log(int i);
	
	
}

Exemplo das 3 (A,B,C) classes
Classe A:

package Delegate;

public class A implements Interface {

	public void grava_log(int i) {
		// TODO Auto-generated method stub
		System.out.println("A"+i);
	}

}

Classe B:

package Delegate;

public class B implements Interface {

	public void grava_log(int i) {
		// TODO Auto-generated method stub
		System.out.println("B"+i);
	}

}

Classe C:

package Delegate;

public class C implements Interface {

	public void grava_log(int i) {
		// TODO Auto-generated method stub
		System.out.println("C"+i);
	}

}

Classe Delegate (nessa classe que chama todas outras):

package Delegate;

import java.util.HashSet;


public class Delegate {
	
	HashSet<Interface> obj = new HashSet<Interface>();
	
	public void setObj(Interface obj2){
		obj.add(obj2);
	}
	
	public void metodoChamaTodos(int i){
		
		for(Interface ob: obj){
			ob.grava_log(i);
		}
		
	}
	
	public void gravaPedido(int i){
		metodoChamaTodos(i);
	}
	
}

Por fim exemplo de uso:

package Delegate;

public class Teste {

	public static void main(String[] args) {
		
		Delegate obj = new Delegate();
		obj.setObj(new A());
		obj.setObj(new B());
		obj.setObj(new C());
		obj.gravaPedido(10);
		
	}
	
}

Veja que nesse exemplo meu usei as 3 classe (a,b,c) mas poderia por exemplo usar somenta A ou B etc… tambem poderia explorar mais a collection.

D

:shock: :shock: :shock: :shock: :shock:

Os delegates em .net são ponteiros de função …
E java não tem isso!

Trabalho com .net e java. Sinceramente acho horrível o uso de delegates no .net.
Vc não pode imaginar em um projeto grande o número de problemas que isso pode lhe trazer.

O uso tem que ser muito bem feito! Pq senão, o projeto começa a virar um embaraçado de coisas super difícil de entender.

Alguém lembra dos goto vida ??? :evil:

E também acho que delegates são um meio de burlar OO. Tente usar o máximo possível de classes abstratas e interfaces.

Até mais,

M

danilomunoz:
:shock: :shock: :shock: :shock: :shock:

Os delegates em .net são ponteiros de função …
E java não tem isso!

Trabalho com .net e java. Sinceramente acho horrível o uso de delegates no .net.
Vc não pode imaginar em um projeto grande o número de problemas que isso pode lhe trazer.

O uso tem que ser muito bem feito! Pq senão, o projeto começa a virar um embaraçado de coisas super difícil de entender.

Alguém lembra dos goto vida ??? :evil:

E também acho que delegates são um meio de burlar OO. Tente usar o máximo possível de classes abstratas e interfaces.

Até mais,

acho o delegate util em varios casos, mas realmente quando seu uso passa do limite fica muito complicado de entender o código.

D

mchiareli:
danilomunoz:
:shock: :shock: :shock: :shock: :shock:

Os delegates em .net são ponteiros de função …
E java não tem isso!

Trabalho com .net e java. Sinceramente acho horrível o uso de delegates no .net.
Vc não pode imaginar em um projeto grande o número de problemas que isso pode lhe trazer.

O uso tem que ser muito bem feito! Pq senão, o projeto começa a virar um embaraçado de coisas super difícil de entender.

Alguém lembra dos goto vida ??? :evil:

E também acho que delegates são um meio de burlar OO. Tente usar o máximo possível de classes abstratas e interfaces.

Até mais,

acho o delegate util em varios casos, mas realmente quando seu uso passa do limite fica muito complicado de entender o código.

Exatamente…

I

Maniezo:
Obrigado a todos, inclusive vou estudar mais “Observer” que o LeoMarola indicou parece ser interessante!

Então como objeto de estudo fiz algo parecido:

Interface que todas novas classe terão que implementar antes de interagir com a Delegate:

package Delegate;

public interface Interface {
	
   public void grava_log(int i);
	
	
}

Exemplo das 3 (A,B,C) classes
Classe A:

package Delegate;

public class A implements Interface {

	public void grava_log(int i) {
		// TODO Auto-generated method stub
		System.out.println("A"+i);
	}

}

Classe B:

package Delegate;

public class B implements Interface {

	public void grava_log(int i) {
		// TODO Auto-generated method stub
		System.out.println("B"+i);
	}

}

Classe C:

package Delegate;

public class C implements Interface {

	public void grava_log(int i) {
		// TODO Auto-generated method stub
		System.out.println("C"+i);
	}

}

Classe Delegate (nessa classe que chama todas outras):

package Delegate;

import java.util.HashSet;


public class Delegate {
	
	HashSet<Interface> obj = new HashSet<Interface>();
	
	public void setObj(Interface obj2){
		obj.add(obj2);
	}
	
	public void metodoChamaTodos(int i){
		
		for(Interface ob: obj){
			ob.grava_log(i);
		}
		
	}
	
	public void gravaPedido(int i){
		metodoChamaTodos(i);
	}
	
}

Por fim exemplo de uso:

package Delegate;

public class Teste {

	public static void main(String[] args) {
		
		Delegate obj = new Delegate();
		obj.setObj(new A());
		obj.setObj(new B());
		obj.setObj(new C());
		obj.gravaPedido(10);
		
	}
	
}

Veja que nesse exemplo meu usei as 3 classe (a,b,c) mas poderia por exemplo usar somenta A ou B etc… tambem poderia explorar mais a collection.

Só para lembrar e incentivar a boa prática, nome de pacote (package) “deve” ser minúsculo.

R

Para mim, o exemplo que o Maniezo nos mostrou segue o Padrão Observer.
ainda não conheço o Delegate.

D

Já que é pra ressuscitar tópico morto :D.

Rapaz, ow preconceito com o bichinho do delegate.

Todo mundo do mundo java apontava e criticava o delegate, só que ele permite uma coisa no net, o pleno funcionamento do Linq.
No java não há ponteiro de função, logo a implementação de algo como o Linq seria um pouco mais difícil.

A

doravan:

Rapaz, ow preconceito com o bichinho do delegate.

Todo mundo do mundo java apontava e criticava o delegate, só que ele permite uma coisa no net, o pleno funcionamento do Linq.
No java não há ponteiro de função, logo a implementação de algo como o Linq seria um pouco mais difícil.

Interessante ver as opiniões da época. Acho que muitas opiniões mudaram hoje em dia.

Engraçado que quando algo é novo, muita gente critica, acha inútil.
Com o tempo aquilo demonstra sua utilidade (ou não) e as opiniões passam a ser mais ponderadas.

Em 2013 teremos lambda no Java 8 e veremos o que a comunidade achará disso.

Criado 4 de abril de 2008
Ultima resposta 29 de jun. de 2012
Respostas 12
Participantes 10