Delegate em JAVA

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

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

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.

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)

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

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.

: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,

[quote=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,

[/quote]

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

[quote=mchiareli][quote=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,

[/quote]

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

Exatamente…

[quote=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.[/quote]

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

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

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.

[quote=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.[/quote]

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.