Моя отправная точка следующая:
- у меня есть метод transform, который я перегружал, чтобы вести себя по-разному, в зависимости от типа передаваемых аргументов (см. Transform (A a1, A a2) и transform (A a1, B b) в моем примере ниже)
- Все эти аргументы реализуют один и тот же интерфейс, X
Я хотел бы применить этот метод преобразования к различным объектам, все реализующие интерфейс X.
Я придумал реализовать преобразование (X x1, X x2), которое проверяет экземпляр каждого объекта перед применением соответствующего варианта моего преобразования.
Хотя это работает, код кажетсяУжасно, и я также обеспокоен накладными расходами производительности для оценки этих различных экземпляров и приведения.Это преобразование - лучшее, что я могу сделать в Java, или есть более элегантный и / или эффективный способ достижения того же поведения?
Ниже приведен тривиальный рабочий пример распечатки BA.Я ищу примеры того, как улучшить этот код.В моем реальном коде у меня естественно больше реализаций «преобразования», и ни одна из них не тривиальна, как показано ниже.
public class A implements X {
}
public class B implements X {
}
interface X {
}
public A transform(A a1, A a2) {
System.out.print("A");
return a2;
}
public A transform(A a1, B b) {
System.out.print("B");
return a1;
}
// Isn't there something better than the code below???
public X transform(X x1, X x2) {
if ((x1 instanceof A) && (x2 instanceof A)) {
return transform((A) x1, (A) x2);
} else if ((x1 instanceof A) && (x2 instanceof B)) {
return transform((A) x1, (B) x2);
} else {
throw new RuntimeException("Transform not implemented for "
+ x1.getClass() + "," + x2.getClass());
}
}
@Test
public void trivial() {
X x1 = new A();
X x2 = new B();
X result = transform(x1, x2);
transform(x1, result);
}