Java - Debería esta clase implementar una interfaz?

 
Vista:

Debería esta clase implementar una interfaz?

Publicado por Andrea (43 intervenciones) el 23/10/2018 18:09:09
He documentado la clase lo mejor que he podido, para que entendais el objetivo de esta.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.util.Objects;
 
/**
 * This class can encapsulate two Objects of any type inside.
 * We can see it like a java.awt.Point, but without operations for
 * a XY point, or a java.util.HashMap, but more simple because you
 * don't need to know a key to get a value. */
public class Dual <T1, T2>{

    private T1 a;
    private T2 b;

    /**
     * Creates a Dual with null values for a and b. */
    public Dual() {
        a = null;
        b = null;
    }

    /**
     * Calls to Dual() and creates a Dual with the objects specified
     * on the parameters. */
    public Dual(T1 objectA, T2 objectB) {
        this();
        a = objectA;
        b = objectB;
    }

    public void setA(T1 objectA) {
        a = objectA;
    }

    public void setB(T2 objectB) {
        b = objectB;
    }

    public T1 getA() {
        return a;
    }

    public T2 getB() {
        return b;
    }

    @Override
    public boolean equals(Object o) {
        boolean equals;
        if(!(o instanceof Dual)) {
            equals = false;
        } else {
            Dual tocompare = (Dual)o;
            equals = Objects.equals(a, tocompare.getA())
                        && Objects.equals(b, tocompare.getB());
        }

        return equals;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        sb.append("a: ");
        sb.append(a.toString());
        sb.append(" b: ");
        sb.append(b.toString());
        sb.append(']');
        return sb.toString();
    }

}

Tengo pensado extender esta clase y darle soporte para arrays, con lo que en la cabeza de la clase quedaría algo como

1
2
3
4
private T1 a;
private T2 b;
private T1[] aArray;
private T2[] bArray;

las 4 variables se iniciarán en null mediante this(), por si se usan los getters/setters que no tocan, que no salga un NullPointerException.

Lo que tengo en duda es si debería implementar una interfaz... Sé para que sirven, pero no termino de darme cuenta cuando és adecuado usarlas y cuando són innecesarias.
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

Debería esta clase implementar una interfaz?

Publicado por Tom (1831 intervenciones) el 23/10/2018 19:14:28
Hay bastantes ejemplos por ahí de cómo la gente implementa la clase Pair<K,V>, la tuya es parecida.
Tambien tienes https://docs.oracle.com/javase/8/javafx/api/javafx/util/Pair.html ya hecha, y https://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.SimpleEntry.html

No creo que sea necesario implementar ningún interfaz (¿ vas ha hacer subclases de esta o algo ?)
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

Debería esta clase implementar una interfaz?

Publicado por Andrea (43 intervenciones) el 23/10/2018 22:17:14
Gracias por responder primero que nada,
cuando la estaba haciendo había pensado en extender esta clase para darle soporte para arrays, pero con el rato me he dado cuenta que puedo usar perfectamente una lista en vez de un array clássico, para almacenar varios valores.

Y no me había percatado de que ya existía una clase Pair en Java :/ mira que estuve buscando y lo más parecido que encontré fué Point.
Pese a todo, mi clase no es para almacenar Key --> Value, sinó que es para almacenar dos datos que están relacionados, pero que ninguno tiene el nombre sobre el otro.
Por ejemplo, para marcar un rango de valores
1
2
3
public static Color createRandomcolor(Dual<Integer, Integer> redrange,
                                          Dual<Integer, Integer> greenrange,
                                          Dual<Integer, Integer> bluerange)
O para hacer parejas de personas:
1
Dual[] parejas = new Dual[]{new Dual("Lucía", "Andrea"), new Dual("David", "Camila"};

Pese a que por ahora no extenderé nada, es bastante possible que en un futuro sí que lo haga, por ejemplo, para crear algna clase Range que esté especializada en rangos de valores, o una clase que permita tener más de 2 objetos dentro, y no sé si valga la pena tener una interfaz por ahí. Digo, Dual ya implementa las funciones más básicas para relacionar valores, no creo que haga falta más abstracción hacia una interfaz, pero tengo poca experiencia y me gustaría tener opinión de alguien que sepa :D
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

Debería esta clase implementar una interfaz?

Publicado por Tom (1831 intervenciones) el 24/10/2018 08:41:58
Te da lo mismo key,value que a,b o left,right. No son más que nombres.
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

Debería esta clase implementar una interfaz?

Publicado por Andrea (43 intervenciones) el 24/10/2018 23:34:16
nada entonces, a usar Pair en vez de Dual haha, he leído sobre el getHashCode() y creo que Pair termina siendo mejor que Dual ya que optimiza ese método.
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