Может ли метод 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...