我有下面提供的“示例代码”,我发现这非常多余,并且想请您与我一起解释是否有更少的冗余方式来处理以下代码。
public interface Bars {
FOO1 FOO1 = (FOO1) get(FOO1.class);
FOO2 FOO2 = (FOO2) get(FOO2.class);
FOO3 FOO3 = (FOO3) get(FOO3.class);
FOO4 FOO4 = (FOO4) get(FOO4.class);
static Bar get(Class<? extends Bar> clazz) {
return (Bar) FooBar.GET.getBars().get(clazz);
}
非常感谢:)
答案 0 :(得分:4)
我们需要更多的建议来建议是否可以完全删除此代码(看起来像您想使用DI框架),但是您可以使get方法通用,使其返回与其参数相同的类型:>
static <T extends Bar> T get(Class<T> clazz);
这将消除呼叫方的类型转换。
答案 1 :(得分:3)
您应该可以这样写:
private static void enterMondoZoo(ChromeDriver driver){
lg.info("Entering in mondoZoo:");
driver.get("http://www.mondozoo.com");
driver.findElement(By.className("mbarlog")).click();
try {
Thread.sleep(10000); //not the best wait in the world
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
driver.switchTo().frame("framebarrelogin");
//Do all your login actions here
driver.findElement(By.xpath("//*[@id='loginform']/div[3]/form/div[1]/p[2]/input")).sendKeys("random");
//Login actions completed
driver.switchTo().defaultContent();
lg.info("Leaving the enteringMondoZoo");
}
根据public interface Bars {
Foo1 FOO1 = get(Foo1.class);
Foo2 FOO2 = get(Foo2.class);
Foo3 FOO3 = get(Foo3.class);
Foo4 FOO4 = get(Foo4.class);
static <T extends Bar> T get(Class<T> clazz) {
return clazz.cast(FooBar.GET.getBars().get(clazz));
}
}
方法的声明结果类型,可能不需要进行cast(...)
调用。
在那之后,我认为没有一种更好的方法来初始化具有不同类型的4个不同变量。
如果这些是局部变量,并且使用的是Java 10或更高版本,则可以使用新的get(Class)
语法,这样就无需在声明中提及类型。 (可以从初始化表达式中推断出类型。)
但是,这不适用于这种情况,因为您的示例将这些变量显示为接口的字段。 var
语法只能在局部变量的声明中使用。
答案 2 :(得分:2)
将get
方法更改为:
static <T extends Bar> T get(Class<T> clazz) {
return clazz.cast(FooBar.GET.getBars().get(clazz));
}
您现在可以调用它而无需重复类型:
var foo1 = get(Foo1.class);
var foo2 = get(Foo2.class);
var
语法仅适用于Java 10+。在Java 10之前,您需要:
Foo1 foo1 = get(Foo1.class);
Foo2 foo2 = get(Foo2.class);
请注意,我已将字母更改为小写以符合Java命名约定。