だから私は次のコードをリファクタリングしようとしています:
/**
* Returns the duration from the config file.
*
* @return The duration.
*/
private Duration durationFromConfig() {
try {
return durationFromConfigInner();
} catch (IOException ex) {
throw new IllegalStateException("The config file (\"" + configFile + "\") has not been found.");
}
}
/**
* Returns the duration from the config file.
*
* Searches the log file for the first line indicating the config entry for this instance.
*
* @return The duration.
* @throws FileNotFoundException If the config file has not been found.
*/
private Duration durationFromConfigInner() throws IOException {
String entryKey = subClass.getSimpleName();
configLastModified = Files.getLastModifiedTime(configFile);
String entryValue = ConfigFileUtils.readFileEntry(configFile, entryKey);
return Duration.of(entryValue);
}
手始めに、次のことを思いつきました。
private <T> T getFromConfig(final Supplier<T> supplier) {
try {
return supplier.get();
} catch (IOException ex) {
throw new IllegalStateException("The config file (\"" + configFile + "\") has not been found.");
}
}
Supplier
ただし、をスローできないため、(明らかに) コンパイルされませんIOException
。のメソッド宣言にそれを追加する方法はありますかgetFromConfig
?
または、次のようにする唯一の方法ですか?
@FunctionalInterface
public interface SupplierWithIO<T> extends Supplier<T> {
@Override
@Deprecated
default public T get() {
throw new UnsupportedOperationException();
}
public T getWithIO() throws IOException;
}
更新Supplier
、メソッドしかないため、インターフェイスが本当に単純なものであることに気付きましたget()
。私が拡張した本来の理由Supplier
は、デフォルトのメソッドなどの基本的な機能を無効にすることです。