1

Iterables を機密にする既存の API をいくつかアップグレードしていますAutoCloseable。たとえば、次のようになります。

/**
 * @throws NoSuchElementException
 */
public static <T> T getOne(Iterable<T> iterable) {
  return iterable.iterator().next();
}

閉じることができる場合は、イテレータを閉じるメソッドが必要です。ここに私がこれまでに持っているものがあります:

/**
 * @throws NoSuchElementException
 */
public static <T> T getOne(Iterable<T> iterable) {
  Iterator<T> iterator = iterable.iterator();
  try {
    return iterable.iterator().next();
  } finally {
    if (iterator instanceof AutoCloseable) {
      try {
        ((AutoCloseable) iterator).close();
      } catch (Exception ignored) {
        // intentionally suppressed
      }
    }
  }
}

JDK ドキュメントで がどのように参照されているかを考えるとThrowable.getSuppressed()、このコードは次のようなことを行う必要がありますか?

      } catch (Exception x) {
        RuntimeException rte = new RuntimeException("Could not close iterator");
        rte.addSuppressed(x);
        throw rte;
      }
4

1 に答える 1

3

try-with-resources次のようなものがあることがわかった場合は、単に構造をピギーバックするのが最善の方法だと思いますAutoCloseable

/**
 * @throws NoSuchElementException
 */
public static <T> T getOne(Iterable<T> iterable) {
  Iterator<T> iterator = iterable.iterator();
  if (iterator instanceof AutoCloseable) {
    try (AutoCloseable c = (AutoCloseable) iterator) {
      return iterator.next();
    }
  } else {
    return iterator.next();
  }
}

次に、言語レベルの構成要素が (closeメソッドを含めて) 例外を正しい方法で処理します。

于 2014-05-07T22:05:23.567 に答える