如何泛型化ProvidersFilter接口以避免使用instanceof
泛型化接口与实现类消除
instanceof 咱直接通过泛型改造来彻底解决instanceof的问题!这样不仅能把类型检查提前到编译期,还能让代码更简洁安全,完全不用再靠运行时判断和抛异常来兜底。
第一步:泛型化ProvidersFilter接口
我们给接口添加泛型参数<T>,明确指定setQuery接收的参数类型和apply返回的类型:
public interface ProvidersFilter<T> { void setQuery(@NonNull T query); T apply(); }
第二步:改造ProvidersRemoteFilter实现类
直接指定泛型类型为Query,这样setQuery方法会直接接收Query类型参数,再也不需要instanceof判断:
public class ProvidersRemoteFilter implements ProvidersFilter<Query> { private Query mQuery; @Override public void setQuery(@NonNull Query query) { mQuery = query; } @Override public Query apply() { return mQuery; } }
第三步:改造ProvidersLocalFilter实现类
同样指定泛型类型为String,方法参数直接匹配类型,代码更清爽:
public class ProvidersLocalFilter implements ProvidersFilter<String> { private String mQuery; @Override public void setQuery(@NonNull String query) { mQuery = query; } @Override public String apply() { return mQuery; } }
改造后的优势
- 编译期类型安全:如果有人尝试给
ProvidersRemoteFilter传入非Query类型的参数,编译器直接报错,从根源避免了运行时异常。 - 代码更简洁:去掉了冗余的类型判断和异常抛出逻辑,代码逻辑一目了然。
- 语义更清晰:泛型参数直接表明了过滤器处理的查询类型,其他开发者一眼就能看懂每个过滤器的用途。
内容的提问来源于stack exchange,提问作者malhobayyeb
相关产品推荐
相关产品推荐

