C'è un buon modo di usare try-with-resources quando si apre un InputStream
in un costruttore e quindi lo si passa a un super costruttore?Try-with-resources quando si chiama super-costruttore
Fondamentalmente quello che voglio fare è questo:
public class A {
public A(InputStream stream) {
// Do something with the stream but don't close it since we didn't open it
}
}
public class B {
public B(File file) {
// We open the stream so we need to ensure it's properly closed
try (FileInputStream stream = new FileInputStream(file)) {
super(new FileInputStream(file));
}
}
}
Ma, naturalmente, dal momento che super
deve essere la prima istruzione nel costruttore questo non è permesso. C'è un buon modo per ottenere questo?
Avrei il chiamante fornire il flusso di input a 'pubblico B (InputStream in)' e chiuderlo anche. Nessun motivo per rendere la classe derivata meno versatile della classe base. – EJP
Più versatile, ma anche più ingombrante da usare. Potrei supportare entrambi, ma non avendo il costruttore 'B (File file)' non è un'opzione. – Raniz
Mi sembra che il tuo problema derivi dal consumo del flusso all'interno del costruttore di A. Se non fosse il caso, dovresti semplicemente archiviare il flusso in una variabile di istanza e rendere A 'AutoClosable'. –