W jaki sposób anonimowa klasa może implementować dwa (lub więcej) interfejsy? Alternatywnie, w jaki sposób może zarówno rozszerzyć klasę, jak i zaimplementować interfejs? Na przykład chcę utworzyć obiekt klasy anonimowej, który rozszerza dwa interfejsy:
// Java 10 "var" is used since I don't know how to specify its type
var lazilyInitializedFileNameSupplier = (new Supplier<String> implements AutoCloseable)() {
private String generatedFileName;
@Override
public String get() { // Generate file only once
if (generatedFileName == null) {
generatedFileName = generateFile();
}
return generatedFileName;
}
@Override
public void close() throws Exception { // Clean up
if (generatedFileName != null) {
// Delete the file if it was generated
generatedFileName = null;
}
}
};
Następnie mogę go użyć w bloku try-with-resources AutoCloseable
jako leniwie zainicjowaną klasą narzędziową:
try (lazilyInitializedFileNameSupplier) {
// Some complex logic that might or might not
// invoke the code that creates the file
if (checkIfNeedToProcessFile()) {
doSomething(lazilyInitializedFileNameSupplier.get());
}
if (checkIfStillNeedFile()) {
doSomethingElse(lazilyInitializedFileNameSupplier.get());
}
}
// By now we are sure that even if the file was generated, it doesn't exist anymore
Nie chcę, aby utworzyć klasę wewnętrzną, ponieważ jestem absolutnie pewien, że ta klasa nie zostaną wykorzystane w dowolnym miejscu z wyjątkiem metody muszę używać go w (i ja też może chcieć użyć zmienne lokalne zadeklarowane w tej metodzie, która może być var
typowym).