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.
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.
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.
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.
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]
[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.
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.