Na ostatnim spotkaniu wrocławskiego JUGa padło pytanie co do Suppliera z poprzedniego wpisu dotyczące tego jak należy zamykać BufferedReader. Trochę się niestety zamotałem i nie byłem wstanie udzielić dobrej odpowiedzi na to pytanie, ale po spokojnym przemyśleniu sprawy rzecz jest bardziej niż prosta.

Błogosławione niech będą rzeczy nowe w Javie 7

Dokładnie zaś konstrukcja try-with-resource, czyli możliwość trochę lepszego zapisu syfu związanego z zamykaniem zasobów. Efektywnie oznacza to, że wystarczy by nasz Supplier implementował interfejs Closeable:

Listing 1. Samo zamykający się Supplier

public class FileReaderViaSupplier implements Supplier<Optional<String>>, Closeable {

	private BufferedReader reader;

	public FileReaderViaSupplier(String filePath) {
		this(new File(checkNotNull(filePath)), UTF_8);
	}

	public FileReaderViaSupplier(File file, Charset charset) {
		checkNotNull(file);
		checkNotNull(charset);
		checkArgument(file.exists(), "File %s does not exist", file.getAbsolutePath());
		try {
			reader = Files.asCharSource(file, charset).openBufferedStream();
		} catch (IOException e) {
			checkState(false, e.getMessage());
		}
	}

	@Override
	public Optional<String> get() {
		try {
			String reference = reader.readLine();
			return Optional.fromNullable(reference);
		} catch (IOException e) {
			return Optional.absent();
		}
	}

	@Override
	public void close() throws IOException {
		reader.close();
	}
}

I to tyle.

Tradycyjnie już na koniec mała prośba jeżeli spodobał ci się ten wpis udostępnij go w mediach społecznościowych korzystając z przycisków poniżej. Jak masz pytania zadaj je w komentarzu. Postaram się zaspokoić twoją ciekawość.