У меня есть proyect, который вызывает различные веб-службы, используя внешнюю библиотеку. Эта библиотека дает мне такие объекты, как это:Java: идентичные объекты, как избежать дублированного кода
public static class ObjA {
@XmlElement(name = "counter", required = true)
protected BigInteger counter;
@XmlElement(name = "data", required = true)
protected String data;
[...]
}
и это:
public static class ObjB {
@XmlElement(name = "counter", required = true)
protected BigInteger counter;
@XmlElement(name = "data", required = true)
protected String data;
[...]
}
как вы можете видеть objA и objB имеют одинаковые свойства, поэтому, если я должен использовать оба, Я дублировать код :
public class myClass {
[...]
private ObjA a;
private ObjB b;
[...]
public void myClass() {
[...]
this.a = new ObjectFactory().createObjA();
this.b = new ObjectFactory().createObjB();
[...]
}
public void init() {
this.initA();
this.initB();
}
private void initA() {
this.a.setCounter(BigInteger.ZERO);
this.a.setData = "";
}
private void initB() {
this.b.setCounter(BigInteger.ZERO);
this.b.setData = "";
}
[...]
}
Inita и INITB идентичны, я не могу получить доступ к коду библиотеки, так что я не могу создать общий интерфейс, каким образом я могу избежать дублированного кода? Я имею в виду, что возможно иметь что-то вроде этого?
private void initObj([ObjA|ObjB] obj) {
obj.setCounter(BigInteger.ZERO);
obj.setData = "";
}
Спасибо! Большое спасибо!
добавление
Пожалуйста, обратите внимание, у меня нет доступа к основной библиотеке, поэтому я не могу добавить модифицировать классы, интерфейсы, WSDL или XSD каким-либо образом. Кроме того, на мой взгляд, не важно, если я использую WS или нет, JAXB или другую библиотеку: вы можете себе представить ObjA и ObjB без аннотаций, как это:
public static class ObjA {
protected BigInteger counter;
protected String data;
[...]
}
public static class ObjB {
protected BigInteger counter;
protected String data;
[...]
}
и суть дела Безразлично» t изменение.
Если вы не можете создать общий интерфейс (в данном случае абстрактный класс), вам придется написать код для инициализации типа 'ObjA' и тип' ObjB' независимо от того, что вы делаете. – EpicPandaForce
Вы можете использовать динамический подход (отражение или BeanUtil) для работы с разными типами с помощью того же метода. Однако у этого есть ряд собственных проблем (статический анализ не знает об этом), поэтому я обычно избегаю этого. Мы ничего не знаем об этом контексте, поэтому могут быть и другие решения. И не забудьте поговорить с поставщиком API. – eckes
Я бы просто сделал супер класс, вручную отредактировал сгенерированный (угадайте его только одно место на класс), затем зачитайте меня и видео о том, что и почему сделали. – tgkprog