Как генерировать мой интерфейс - PullRequest
0 голосов
/ 30 мая 2018

У меня есть следующий интерфейс:

public interface ProvidersFilter {
    void setQuery(@NonNull Object query);

    Object apply();
}

И следующие классы реализации:

Первая реализация:

public class ProvidersRemoteFilter implements ProvidersFilter {

    private Query mQuery;

    @Override
    public void setQuery(@NonNull Object query) {
        if (query instanceof Query) {
            mQuery = (Query) query;
        } else {
            throw new RuntimeException("query object must be of type com.google.firebase.firestore.Query");
        }
    }

    @Override
    public Object apply() {
        return mQuery;
    }
}

Вторая реализация:

public class ProvidersLocalFilter implements ProvidersFilter {

    private String mQuery;

    @Override
    public void setQuery(@NonNull Object query) {
        if (query instanceof String) {
            mQuery = (String) query;
        } else {
            throw new RuntimeException("query object must be of type String");
        }
    }

    @Override
    public Object apply() {
        return mQuery;
    }
}

Я бы хотел не использовать instanceof, обобщая мой интерфейс и реализуя классы.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Поскольку локальные и удаленные провайдеры имеют один и тот же код, у вас может быть абстрактный класс, реализующий общие черты.В этом случае интерфейс не нужен, но вы можете сохранить его все так же:

public interface ProvidersFilter<Q> {
    void setQuery(@NonNull Q query);
    Q apply();
}

abstract class AbstractProvidersFilter<Q> {
    private Q mQuery;

    @Override
    public void setQuery(@NonNull Q query) {
        mQuery = query;
    }

    @Override
    public Q apply() {
        return mQuery;
    }
}

public class ProvidersRemoteFilter extends AbstractProvidersFilter<Query> {}
public class ProvidersLocalFilter extends AbstractProvidersFilter<String> {}
0 голосов
/ 30 мая 2018

Вам необходимо добавить переменную типа в ваш интерфейс.

Интерфейс:

public interface ProvidersFilter<T> {
    void setQuery(@NonNull T query);

    T apply();
}

Реализация класса:

public class ProvidersRemoteFilter implements ProvidersFilter<Query> {

    private Query mQuery;

    @Override
    public void setQuery(@NonNull Query query) {
        mQuery = query;
    }

    @Override
    public Query apply() {
        return mQuery;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...