Java - Es esta clase la pura salud?

 
Vista:

Es esta clase la pura salud?

Publicado por Jordi (135 intervenciones) el 26/04/2018 22:36:57
Pues eso, que ya hace tiempo me he dado cuenta que infinidad de veces necesito pasar dos datos a la vez de un sitio a otro, por ejemplo los puntos xy de una entidad en un plano, o los puntos xy de un componente de swing.
En un par de ocasiones usé la clase Point, pero no me terminó de convencer ya que para simplemente pasar datos de un sitio a otro me parecía un poco desperdicio de memoria: la clase tiene multitud de métodos. Sobretodo cuando tienes un array de 2000 puntos, pues hasta lo más mínimo termina sumando.
También están los diccionarios y tal, que en cierto modo también permitirían pasar datos en parejas, pero tienen muchas cosas que no necesito, entonces hice esta clase y me lo estoy pasando genial usándola en todas partes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**Esta clase guarda dos elementos juntos. Puede ser muy útil por ejemplo para guardar
 * posiciones de un array de varias dimensiones en una sola variable y de forma sencilla.
 * A diferencia de los diccionarios, esta clase no crea relaciones de Key --> Value.*/
public class Dual <T0, T1>{
 
	private T0 a;
	private T1 b;
 
	public Dual(T0 a, T1 b) {
		this.a=a;
		this.b=b;
	}
	/**The return is a==d.getA()&&b==d.getB(), then for objects that needs .equals() to be
	 * compared this method will cause unexpected results.*/
	public boolean equals(Dual<T0,T1> d) {
		return a.equals(d.getA())&&b.equals(d.b);
	}
 
	public T0 getA() {
		return a;
	}
	public void setA(T0 a) {
		this.a=a;
	}
 
	public T1 getB() {
		return b;
	}
	public void setB(T1 b) {
		this.b=b;
	}
 
}

Que os parece? Lo que más me trae de cabeza es lo del equals.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
-1
Responder
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Es esta clase la pura salud?

Publicado por Agustin (170 intervenciones) el 27/04/2018 05:14:28
Me alegra que hayas descubierto la Tupla, pero tu código tiene múltiples deficiencias si lo comparamos con las implementaciones estándar utilizadas en cualquier lenguaje actual.

1 - Para empezar, la única razón por la que estás escribiendo ese código es porque estás usando un lenguaje arcaico que se quedó atascado en 1999, ya que, a diferencia de prácticamente todos los demás lenguajes usados en la actualidad, java no provee tuplas en su librería estandar. Mientras que cualquier lenguaje moderno y usable ya incorpora este concepto desde hace por lo menos una década.

Casi todos o directamente todos los demás lenguajes usados en la actualidad proveen esta característica "out of the box" (es decir, ya existe y no necesitas crearla vos mismo). Por supuesto java tiene 15 años de atraso con respecto a cualquier lenguaje moderno.

2 - Como java no posee Value Types, o, estrictamente hablando, la capacidad de definir Value Types propios fuera de los que trae out-of-the-box (de nuevo, algo que los lenguajes modernos tienen hace 15 años), el valor de tu código se ve disminuído, ya que la Tupla es un caso típico para el uso de los mismos. al tratarse de un mero contenedor, el hecho de que sea heap-allocated es realmente un desperdicio de memoria, e incrementa la presión del GC de forma innecesaria. Esta deficiencia no es salvable, al menos hasta que se implemente le soporte para value types en la JVM, que como viene va a estar para el 2020, básicamente 20 años más tarde que en en resto de los lenguajes usados en la actualidad.

3 - Otra deficiencia de java es la imposibilidad de definir tipos no nuleables. Es decir, cualquier referencia a tu clase siempre puede ser null y provocar excepciones. Esto no es salvable ni siquiera con el workaround que las últimas versiones de java introducen: un tipo Optional<T>, que por supuesto en sí mismo es nuleable como cualquier otra clase de java.

Esto en la práctica lleva a ensuciar el código con "programación defensiva", llenándo de if (x != null) por todos lados que solamente producen ruido inútil que por supuesto en lenguajes modernos es innecesario.

4 - Otro problema molesto de java es la carencia de Properties, que también produce una cantidad de ruido completamente innecesario y cuya única razón de existir es la filosofía retrógrada noventosa de java.

En lugar de eso java te obliga a escribir esos getters y setters que son terriblemente tediosos, no solamente en su definición sino (y más importante) en el uso, ya que en lugar de usar la sintáxis miObjeto.Property se debe usar miObjeto.getProperty(), lo cuál es mucho más verboso y sucio.

Por supuesto todos los demás lenguajes tienen mejor soporte para este concepto que java, como demuestra el artículo.

5 - Siguiendo con las deficiencias de java, es importantísimo mencionar que los generics de java son terriblemente limitados y en realidad son un simple "truco" del compilador, ya que no existen en runtime y la VM no tiene noción ni soporte para los mismos. En lugar de eso, todas tus referencias genéricas a tipos paramétricos se convierten en Object en tiempo de ejecución. Con lo cuál por ejemplo, para la JVM es imposible distinguir Dual<Cliente, Producto> de Dual<Perro, Gato> (por dar ejemplos simples).

Y esto no es lo peor de todo, sino que además de esta enorme deficiencia java presenta una aún peor: los generics de java NO soportan ni siquiera los value types predefinidos de java (conocidos como "tipos primitivos"), con lo cuál ni siquiera vas a poder crear un Dual<int, double> sino que vas a tener que usar los famosos "wrappers", desperdiciando todavía más memoria, y creando una indirección completamente innecesaria.

Alternativamente y como workaround, podes crear versiones especializadas no genéricas de tu clase para soportar los tipos primitivos: IntDual, DoubleDual, y asi. Por supuesto esta duplicación es terriblemente tediosa y acarrea una cantidad de problemas, por ejemplo el hecho de que IntDual sería completamente incompatible con DobleDual o Dual<Perro, Gato>.

6 - Otra carencia, o desición de diseño retrógrada de java es la negación a soportar Sobrecarga de Operadores, con lo cuál para comparar dos instancias de tu clase se debe usar a.equals(b) en lugar de a == b que es muchísimo más limpio y claro, y que por supuesto es válido en todos los demás lenguajes excepto java. Esto sin mencionar que al ser una clase y no un Value Type o struct, no tiene identidad estructural y la tenés que implementar vos mismo overrideando equals(), getHashCode(), etc

Con todas estas deficiencias, podemos concluir sin temor a equivocarnos que claramente java es un pésimo lenguaje, y que en lugar de esperar otros 4 o 5 años a que se adapte y puedas sentir que al menos te moviste de 1999 a 2002, lo que más te conviene es utilizar cualquier lenguaje moderno y olvidarte de java para siempre, sepultándolo en el olvido donde corresponde, junto con Cobol y GW-Basic del año 70.

La "pura salud" es no tener que usar java jamás en la vida, para nada.

Ninguna de las deficiencias que menciono arriba existen en lenguajes modernos, como Kotlin, C#, F#, Python, TypeScript, y cualquier otro lenguaje que no esté atascado en 1999 como java.

Te dejo un ejemplo de tuplas implementadas en un lenguaje moderno, decente y usable.

Espero que te sirva. Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-5
Comentar

Es esta clase la pura salud?

Publicado por Tom (1831 intervenciones) el 27/04/2018 09:12:41
Probablemente no deberías necesitar esta clase, pero en apariencia está bien. El equals tampoco parece tener ningún problema ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Es esta clase la pura salud?

Publicado por Agustin (170 intervenciones) el 27/04/2018 14:57:00
En vez de downvotear como un nene caprichoso, podrías dar argumentos técnicos concretos que demuestren que estoy equivocado. Lástima que no creo que los encuentres porque (A) no tenés mucha idea, y (B) tengo razón.

Como diría Néstor, un abrazo para la gilada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-5
Comentar

Es esta clase la pura salud?

Publicado por Tom (1831 intervenciones) el 27/04/2018 15:05:39
Yo no puedo "downvotear", así que ... que este post cuente como un -5 (creo que no tienes más votos negativos porque se te lee poco).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Es esta clase la pura salud?

Publicado por Agustin (170 intervenciones) el 27/04/2018 15:37:30
-5? Contame qué parte de lo que dije es incorrecta?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-5
Comentar
sin imagen de perfil
Val: 20
Ha disminuido su posición en 14 puestos en Java (en relación al último mes)
Gráfica de Java

Es esta clase la pura salud?

Publicado por Alfredo (5 intervenciones) el 04/05/2018 10:13:27
Buenas!, yo procurare enfocarme en resolver tu problema, ya que... bueno, es lo esencial(?

En java no se puede devolver mas de un valor por funcion, lo lamento, y no, no significa que java este atrasado ni nada, es solo que, no es un lenguaje de la generacion actual, para eso esta kotlin.

Sin embargo, algo que puedes hacer es devolver directamente un array, ya que con eso, puedes devolver una cantidad n de valores por funcion, ya que puedes tener un array de 2 casillas, o undo de 1000, no importaria, solo devolverias el array y listo, si, es un proceso que consume memoria, y si, puede ser verboso/tedioso/innecesario, pero es lo que hay si estas usando java, solo queda tener nuestras mañas para resolver los problemas que encontremos, y en cuyo caso, no te preocupes por la memoria siendo usada de ese modo, es una mala costumbre, pero java cuenta con un recolector de basura que elimina las variables que dejan de usarse, asi que no te preocupes por un casual "new Pont2d(x,y);" o cosas similares, es malo acostumbrarse a eso, pero no es exactamente inutil, si mi respuesta te ayudo, perfecto, y de caso contrario, avisamelo para intentar solucionarlo de algun otro modo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Es esta clase la pura salud?

Publicado por Agustin (170 intervenciones) el 04/05/2018 20:59:44
Por supuesto que si java está atrasado, ya que vemos en el roadmap del mismo que planifican de acá a unos años (2020) incorporar los features que menciono, con lo cual se demuestra que están 20 años atras del resto de la industria.

usar un array en lugar de un Tuple es una pésima idea, ya que el array no garantiza la aridad (un array puede tener entre 0 y N elementos, mientras que un Tuple define su aridad como parte de la firma del propio tuple). Ademas, el array puede contener solo objetos del mismo tipo, o bien ser un Object[] y perder type safety. El Tuple<A,B> soporta un elemento de tipo A y uno del tipo B que no necesariamente tienen que estar relacionados entre si.

"es lo que hay" - Tambien se puede, como bien dije antes, usar lenguajes modernos y usables y olvidarse de java para siempre.

"solo queda tener nuestras mañas" - La resignación del esclavo. Alguien con buenos conocimientos elige donde trabajar, y por lo tanto elige las tecnologías con las que trabajar. No hay ninguna razón para "tener mañas" y conformarse con lidiar con un lenguaje patético y arcaico.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-4
Comentar