KotlinのClass Delegationを使ってラッパクラスをめちゃめちゃ短くする

SeleniumのWebDriverの閉じ忘れ防止のため、AutoCloseableを実装するラッパを作っていました。以下の様なコードです。

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.internal.FindsById;

import java.util.List;
import java.util.Set;

public class AutoCloseableDriver implements WebDriver, JavascriptExecutor, FindsById
, AutoCloseable {
private ChromeDriver webDriver;

AutoClosableDriver(ChromeDriver webDriver) {
this.webDriver = webDriver;
}

@Override
public void get(String s) {
this.webDriver.get(s);
}

@Override
public String getCurrentUrl() {
return this.webDriver.getCurrentUrl();
}

@Override
public String getTitle() {
return this.webDriver.getTitle();
}

@Override
public List findElements(By by) {
return this.webDriver.findElements(by);
}

@Override
public WebElement findElement(By by) {
return this.webDriver.findElement(by);
}

@Override
public String getPageSource() {
return this.webDriver.getPageSource();
}

@Override
public void close() {
this.webDriver.close();
}

@Override
public void quit() {
this.webDriver.quit();
}

@Override
public Set getWindowHandles() {
return this.webDriver.getWindowHandles();
}

@Override
public String getWindowHandle() {
return this.webDriver.getWindowHandle();
}

@Override
public TargetLocator switchTo() {
return this.webDriver.switchTo();

}

@Override
public Navigation navigate() {
return this.webDriver.navigate();

}

@Override
public Options manage() {
return this.webDriver.manage();

}

@Override
public Object executeScript(String s, Object... objects) {
return this.webDriver.executeScript(s, objects);
}

@Override
public Object executeAsyncScript(String s, Object... objects) {
return this.webDriver.executeAsyncScript(s, objects);
}

@Override
public WebElement findElementById(String s) {
return webDriver.findElementById(s);
}

@Override
public List findElementsById(String s) {
return webDriver.findElementsById(s);
}
}

コンストラクタで渡されたWebDriverに全ての処理を委譲するだけです。
ありがち、かつ冗長なのでKotlinではDelegationという便利な機能があって、こんなに短くなります。

import org.openqa.selenium.JavascriptExecutor
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.internal.FindsById

class AutoCloseableDriver constructor(private val webDriver: ChromeDriver) : WebDriver by webDriver,
   JavascriptExecutor by webDriver, FindsById by webDriver, AutoCloseable

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です