Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

java interface

14.07.17 17:05
Re: java interface
 
TUKL завсегдатай
TUKL
в ответ Kvint 05.07.17 22:27

Generic можно было бы использовать, если бы методы были одинаковые.

public interface TestInterface<T> {
public void a(T value);
}


public class TestImplA implements TestInterface<BigInteger> {


@Override

public void a(BigInteger value) { }

}


Но тут названия методов отличаются, в первом случае А, а во втором - B:

public class A implements TestInterface{
public A(BigInteger value){
System.out.println("This is A");
}
}

public class B implements TestInterface{
public B(BigDecimal value){
System.out.println("This is B");
}
}



Архитектура явно кривая, грубо нарушено Single Responsibility Rule, классы огромные итд. Необходимо разбить интерфейс на несколько, с использованием дженериков, выделить отдельные классы и так далее. Толку от использования общего интерфейса, если методы все равно разные, и по идее впоследствии в коде нужно будет делать проверки при их вызове в зависимости от аргумента?

TestInterface worker = TestInterfaceFactory.getTestInterface(value);

if (value instanceof BigInteger) {
worker.a(value);
} elseif (value instanceof BigDecimal) {
worker.b(value);
} else {
...


Но в любом разе решение - это фабрика:

public class TestInterfaceFactory {


public static TestInterface getInstance(Object value) {
if (value instanceof BigInteger) {
return new TestImplA();
} else if (value instanceof BigDecimal) {
return new TestImplB();
} else {
throw new IllegalArgumentException("unsopported value type");
}
}

}
 

Перейти на