40

だから私は次のコードをリファクタリングしようとしています:

/**
 * 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は、デフォルトのメソッドなどの基本的な機能を無効にすることです。

4

6 に答える 6

22
  • Supplierこれを行うと、 UnsupportedOperationException のみをスローするため、 として使用できなくなります。

  • 上記を考慮して、新しいインターフェイスを作成し、そのgetWithIO中でメソッドを宣言してみませんか?

    @FunctionalInterface
    public interface SupplierWithIO<T> {
        public T getWithIO() throws IOException;
    }
    
  • 古いスタイルの Java インターフェースの方が優れているものがあるのではないでしょうか? Java 8 が登場したからといって、古いスタイルの Java がなくなったわけではありません。

于 2014-03-27T12:46:31.037 に答える