100 votes

Héritage multiple pour une classe anonyme

Comment une classe anonyme peut-elle implémenter deux interfaces (ou plus) ? Alternativement, comment peut-elle les deux étendre une classe et implémenter une interface ? Par exemple, je veux créer un objet de classe anonyme qui étend deux interfaces :

    // 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;
            }
        }
    };

Je peux ensuite l'utiliser dans un bloc try-with-resources comme suit AutoCloseable comme classe utilitaire initialisée paresseusement :

        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

Je ne veux pas créer une classe interne parce que je suis absolument sûr que cette classe ne sera pas utilisée ailleurs que dans la méthode dans laquelle j'ai besoin de l'utiliser (et j'ai aussi pourrait voulez utiliser les variables locales déclarées dans cette méthode qui pourraient être de var type).

1voto

Une classe anonyme s'étend ou s'implémente tout en créant son objet. Par exemple :

Interface in = new InterFace()
{

..............

}

Ici, la classe anonyme implémente l'interface.

Class cl = new Class(){

.................

}

ici la classe anonyme étend une classe abstraite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X