martes, 21 de junio de 2011

Delegados y no delegados

Como nuestro post anterior habla de los delegates de .NET no está de más recordarle a Manel - aunque eso me haga retardar un día el último post de eFactura - que los programadores Java son muy felices sin ellos. ¿Si no usan punteros por qué rayos deberían usar punteros a función? Su ejemplo "adaptado" para ordenar una lista en C#

public class Developer
{
public string Name { get; set; }
public string Technology { get; set; }
}

public class Test
{
public static void Main(string[] args)
{
List<Developer> developers = new List<Developer> {
new Developer {Name = "Pedro", Technology = "Java"},
new Developer {Name = "Manel", Technology = ".NET"},
new Developer {Name = "Oscar", Technology = ".NET"},
new Developer {Name = "Noe", Technology = "Java"},
new Developer {Name = "Elias", Technology = "Java"}
};
developers.Sort(delegate(Developer x, Developer y)
{
if (x == null)
return -1;
else if (y == null)
return 1;
else
return string.Compare(x.Name, y.Name);
});
}
}

Se haría en Java con una clase anónima.

public class Developer
{
private String name;
private String technology;
public Developer(String name, String technology) {
this.name = name;
this.technology = technology;
}
public String getName() {
return name;
}
public String getTechnology() {
return technology;
}
}

public class Test {
public static void main(String args[]) {
List<Developer> developers = Arrays.asList(
new Developer ("Pedro", "Java"),
new Developer ("Manel", ".NET"),
new Developer ("Oscar", ".NET"),
new Developer ("Noe", "Java"),
new Developer ("Elias", "Java")
);
Collections.sort(developers, new Comparator<Developer>() {
public int compare(Developer o1, Developer o2) {
if (o1 == null || o1.getName()==null)
return -1;
else if (o2 == null || o2.getName()==null)
return 1;
else
return o1.getName().compareTo(o2.getName());
}
});
}
}


Si bien es cierto que .NET también tiene la forma Java de hacer las cosas, lo habitual es que se use el delegado ( o directamente el nombre de una función que haga la ordenación). Y si, en Java ocupa más lineas, pero todos los IDEs escriben los getters y los setters.

2 comentarios:

  1. Bueno, que en Java no se use directamente punteros no significa que no los haya, y tampoco significa que no puedan ser conscientes de ello...

    ResponderEliminar
  2. Siempre subyacen punteros, es cierto. Pero queda raro que si no puedes usar punteros a variables puedas usar punteros a métodos, ¿no?

    Realmente .net es una amalgama de tecnologías y se pueden usar punteros envueltos en objetos ( el tipo IntPtr, por ejemplo ) para manejar APIs nativas. Pero me refiero a que en OOP no es habitual usarlos, y sin embargo, los delegados si que se usan con mucha frecuencia.

    Eso si, son cómodos. Otra cosa es que en Java se pueda vivir sin ellos.

    ResponderEliminar