java - 与多个参数的接口
问题描述
我创建了一个实用程序类,它有一些检查网页元素的方法。现在是时候重构这些方法,使它们属于自己的类,以便我可以传递它们。
下面是类中方法的几个存根,但它们还有更多具有不同参数的存根:
public boolean checkElementExistsByText(String key, String text) {}
public boolean checkElementText(String key, Predicate<String> predicate) {}
public boolean checkElementText(WebElement element, Predicate<String> predicate){}
我尝试创建以下界面:
interface CheckElementInterface {
boolean checkElement();
}
我遇到了这个问题,因为我无法在 checkElement 方法中处理多个参数,所以我必须将它们传递给每个实现它的类的构造函数;
public class CheckedElementExistsByText implements CheckElementInterface{
private final WebElement element;
private final String text;
public CheckedElementExistsByText(WebElement element, String text) {
this.element = element;
this.text = text;
}
@Override
public boolean checkElement() {
}
这是最好的方法,还是有一种方法可以将多个参数传递给 checkElement() 方法?
谢谢
解决方案
您可以创建参数化界面:
interface CheckElementInterface<T1, T2> {
boolean checkElement(T1 elem1, T2 elem2);
}
然后您可以创建实现,例如:
public class CheckedElementExistsByText implements CheckElementInterface<WebElement, String>{
@Override
public boolean checkElement(WebElement element, String text) {
}
编辑:
具有参数化接口的方法提出了一个问题,即如何为具体的 T1、T2 获得接口的实现。它需要实现中的附加功能来帮助分派“checkElement”请求。例如
interface CheckElementInterfaceProvider {
CheckElementInterface<T1, T2> getChecker(T1, T2);
}
和示例用法:
WebElement element;
String text;
checkElementInterfaceProvider.get(element, text).checkElement(element, text);
正如我现在所看到的:checkElementMethod 中不需要参数,因为 CheckElementProvider 可以充当工厂。
WebElement element;
String text;
checkElementInterfaceProvider.get(element, text).checkElement();
并修改了 CheckElementInterface (现在与您的示例几乎相同 - 仅添加了类型参数):
interface CheckElementInterface<T1, T2> {
boolean checkElement();
}
public abstract class AbstractCheckElement<T1, T2> implements CheckElementInterface<T1, T2>{
private final T1 e1;
private final T2 e2;
public AbstractCheckElement(T1 e1, T2 e2) {
this.e1 = e1;
this.e2 = e2;
}
}
public class CheckedElementExistsByText implements AbstractCheckElement<WebElement, String>{
public AbstractCheckElement(WebElement element, String text) {
super(element, text);
}
@Override
public boolean checkElement() {
}
}
推荐阅读
- sapui5 - sap.m.GenericTile 的容器
- grails - Grails:插件 [controllers:3.3.9] 无法重新加载对文件的更改
- swift - AVCaptureVideoPreviewLayer 和 AVDepthData.depthDataMap 问题
- facebook-graph-api - 如何在不登录的情况下从 Instagram Business API 获取 Instagram Business 帐户的数据?
- linux - 使用 select() 进行 I/O 多路复用
- python - 我们如何在 Squish Tool 中使用 BDD 执行跨浏览器测试
- android - BatteryManager 健康值“9”
- c# - 如何在不使用 c#(asp.net) 运行项目的情况下在 30 分钟后自动刷新页面
- java - Netbeans 8.2 (RCP) 支持的最新 JDK 版本是什么?
- r - “撤消”使用 stringr::str_split 创建的嵌套 tibble