Может ли метод java возвращать значение в зависимости от условия?
У меня есть интерфейс ICoreClient
, и классы AClient
и BClient
реализуют это.
ICoreClient
отображается для пользователей.
Мне нужно добавить новый метод в интерфейс ICoreClient
. Таким образом, он должен быть реализован в обоих клиентах. Я не могу сделать этот метод обобщенным, поскольку он имеет совершенно разные сигнатуры, но аналогичные функции.
У меня есть 2 интерфейса xx
и yy
ClientA
реализует xx
и ClientB
реализует yy
Итак, я решил добавить новый testMethod
в ICoreClient
, который предоставит мне экземпляр xx
или yy
в зависимости от клиентов.
Я хочу вернуть экземпляр этих интерфейсов из одного метода в зависимости от условия.
В ClientA
:
public xx testMethod(){
return instanceof xx;
}
В ClientB
:
public yy testMethod(){
return instanceof yy;
}
Что мне следует писать в интерфейсе ICoreClient
?
public zz testMethod()
Я попытался помещать фиктивный интерфейс zz
(действуя как общий супертип), как это делают xx
и yy
. Но все еще не удалось выставить методы xx
и yy
в своих соответствующих клиентах, поскольку в итоге он получил тип zz
.
Есть ли какой-либо известный подход для такого рода сценариев?
Изменить. Если я возвращаю тип Object
, метод этих интерфейсов не будет отображаться. Хотя Object содержит экземпляр xx
или yy
,
Пользователю все равно нужно отбросить его (xx
или yy
, как он будет знать?) для использования методов в интерфейсе. Я хочу разоблачить методы ClientX
без необходимости нажатия на ClientA
или ClientB
...
Ответы
Ответ 1
После редактирования вы можете искать generics. Вы можете сделать свой интерфейс таким образом
interface ICoreClient<T>{// T will be set by each class implementing this interface
T testMethod();
}
и каждый из ваших классов может выглядеть как
class ClientA implements ICoreClient<xx>{
xx testMethod(){
//return xx
}
}
class ClientB implements ICoreClient<yy>{
yy testMethod(){
//return yy
}
}
Ответ 2
Возможно, только если xx
и yy
имеют общий супер-тип (интерфейс или класс). В худшем случае вы всегда можете вернуть Object.
public Object testMethod () // or a more specific common super type of `xx` and `yy`
{
if (..some condition..) {
return ..instanceof `xx`..;
} else if (..other condition..) {
return ..instanceof `yy`..;
}
return null; // or some other default instnace
}
Ответ 3
Как возвращаемый объект означает, что вам придется наложить на клиента, что вместо него можно вернуть пользовательский объект, который содержит ваши возможные значения:
public class MethodResult
{
private xxx xResult;
private yyy yResult;
public MethodResult(xxx xResult){
this.xResult=xResult;
}
public MethodResult(yyy Result){
this.yResult=yResult;
}
public xxx getXResult(){return xResult;}
public yyy getYResult(){return yResult;}
}
а затем верните этот тип:
public MethodResult testMethod ()
{
if (..some condition..) {
return new MethodResult(new xxx());
} else if (..other condition..) {
return new MethodResult(new yyy());;
}
}
}
Затем клиент может проверить, какой результат не является нулевым, и использовать соответствующий тип, имея доступ ко всем методам, определенным в xxx или yyy, в зависимости от того, какой из них установлен. Или вы можете добавить метод, который позволяет проверить, какой результат был установлен, сделать решение, а не проверять значение null...