No hay sobrecarga del operador en Java. Aparentemente por razones de gusto. Lástima realmente.
(Algunas personas afirman que Java tiene sobrecarga, debido +
con String
y quizás autoboxing/unboxing.)
Vamos a hablar de los tipos de valor.
Muchas clases tempranas (y algunas posteriores) hacen un lío perfecto de esto. Particularmente en AWT. En AWT debería hacer copias explícitas de valores simples en cualquier lugar. Es casi seguro que desee que los tipos de valor sean inmutables: la clase debe ser definitiva y nunca debe cambiar de estado (generalmente todos los campos final
apuntan a inmutables efectivos).
Así:
public final class Point {
private final int x;
private final int y;
private Point(int x, int y) {
this.x = x;
this.y = y;
}
public static of(int x, int y) {
return new Point(x, y);
}
public int x() {
return x;
}
public int y() {
return y;
}
public Point add(Point other) {
return of(x+other.x, y+other.y);
}
// Standard fluffy bits:
@Override public int hashCode() {
return x + 37*y;
}
@Override public boolean equals(Object obj) {
if (!(obj instanceof Point)) {
return false;
}
Point other = (Point)obj;
return x==other.x && y==other.y;
}
@Override public String toString() {
return "("+x+", "+y+")";
}
}
El código original estaba confundido entre int
y double
, por lo que he elegido uno. Si usó double
, debe excluir NaN
. "Punto" tiende a implicar un punto absoluto, que no tiene sentido agregar. "Vector" o "dimensión" probablemente serían más apropiados, dependiendo de lo que pretendas.
He ocultado el constructor, ya que la identidad no es importante. Posiblemente los valores podrían almacenarse en caché. Posiblemente es, por ejemplo, común agregar un punto a un punto cero, por lo que no es necesario crear puntos.
Es posible que desee una versión mutable, por ejemplo, para usar como acumulador. Esta debe ser una clase separada sin una relación de herencia.Probablemente no en casos sencillos, pero voy a mostrar todas formas:
public final class PointBuilder {
private int x;
private int y;
public PointBuilder() {
}
public PointBuilder(Point point) {
this.x = point.x;
this.y = point.y;
}
public Point toPoint() {
return new Point(x, y);
}
public PointBuilder x(int x) {
this.x = x;
return this;
}
public PointBuilder y(int y) {
this.y = y;
return this;
}
public PointBuilder add(Point other) {
this.x += other.x;
this.y += other.y;
return this;
}
}
Parece que tendría más sentido implementar un método de instancia en lugar de un método de clase para esto. –
En una clase mutable, sería normal alterar la instancia existente, aunque hacer 'Punto' un valor inmutable sería mejor. (Además, debería ser una minúscula 'a' en' add'.) –