Pourquoi Autoclosable est l'interface de base pour Closeable (et pas vice versa)?

autant Que je sache, le Fermer interface était autour de Java 1.5 et le Autoclosable a été introduit en Java 1.7.

Ce que j'essaie de comprendre, c'est pourquoi Fermer s'étend Autoclosable et pas vice versa? Est-ce dû à une dépendance à l'envers (Ne pas pouvoir changer l'interface refermable), c'est-à-dire à la nécessité pour un Autoclosable d'avoir une exception plus large que refermable? Ou est ma logique tout à fait inacceptable et il faut que façon?

22
demandé sur Tshepang 2013-10-24 21:24:30

4 réponses

de cette façon, tout le code utilisateur qui a implémenté Closeable obtient automatiquement de mettre en œuvre AutoCloseable, ce qui leur permet de bénéficier automatiquement de la syntaxe try-with-resources.

27
répondu Louis Wasserman 2013-10-24 17:27:55

le commentaire de@Sotirios Delimanolis est clair.

L'équipe Java 7 voulait un mécanisme pour étiqueter les objets comme étant auto-fermables pour la construction "essayer avec les ressources". Malheureusement la spécification API pour le Closeable.close() méthode est trop stricte. Il nécessite l' close() méthode pour être idempotent ... mais cela n'est pas nécessaire dans le cas d'utilisation "essayer avec les ressources".

ils ont donc introduit le AutoClosable interface avec un close() sémantique ... et rétro-équipée Closeable comme sous-type de AutoCloseable.

L'autre chose est que AutoCloseable.close() est déclarée comme jetant Exception plutôt que IOException. Cela signifie que l' AutoCloseable L'API est moins restrictive que Closeable ... et étant donné qu'il est effectivement utilisé comme un rappel API dans le try-with-resources, cela le rend plus souples et plus largement applicables. (L'API peut être utilisée pour des ressources qui n'ont rien à voir avec les e/s, mais qui peuvent quand même créer des exceptions.) L'envers de la médaille est le fait de taper Java ne leur permettrait pas de faire un tel changement si le closes() throws Exception la méthode avait été injectée dans le sous-type.


Les alternatives ont été les suivants:

  • pour restreindre "try with resources" aux ressources avec une fermeture idempotent ... ce qui limite son utilité, ou

  • rétrospectivement modifier la sémantique de l' Closeable.close()... ce qui pourrait conduire à des difficultés pour les gens de portage de l'ancien code à Java 7

  • de changer rétrospectivement la signature de Closeable.close()... ce qui briserait la compatibilité binaire.

20
répondu Stephen C 2017-04-25 03:28:09

try-with-resources (ci-dessous un exemple de code) a été introduit en Java 7, les concepteurs du langage ont voulu changer certaines choses mais ont eu besoin d'une rétrocompatibilité (tout le code qui est écrit dans les versions précédentes ne devrait pas devenir obsolète avec l'introduction de nouvelles fonctionnalités) aussi donc ils ont créé une Superinterface AutoCloseable avec les règles qu'ils voulaient.

Un exemple d'essayer de ressources:

    try (NewResource a = NewResource.CreateResource();
{
    }

ci-Dessus le code est d'Essayer avec des ressources. Nous pouvons simplement comprendre par ceci est que dans ce code nous pouvons déclarer une nouvelle variable elle-même dans le code d'essai et cette variable peut faire appel à d'autres méthodes dans le code. A part la diminution de la verbosité de try block ce code ne nécessite pas non plus de block final, mais L'environnement d'exécution doit être Java 7 ou supérieur. Bien que la fin soit créée par JVM elle-même.

closeable& Autocloseable interface ne contient qu'une seule méthode

void close()

close () méthode closeable lance IOException,Autocloseableclose() lancers de méthode Exception.

1
répondu Nikhil Arora 2016-11-02 19:24:20

Closeable a quelques limites, car il ne peut lancer IOException, de sorte qu'il ne peut pas être modifié sans casser le code d'héritage. Donc AutoCloseable a été introduit, qui peut jeter Exception.

AutoCloseable doit être utilisé pour les applications utilisant >JDK7.

comme JDK7 + les bibliothèques utilisent AutoCloseable et l'héritage de code qui implémente Closeable toujours besoin d'être compatible avec JDK7+, il est fait que extend Closeable Autoclosable.

public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}

AutoCloseable a été spécialement conçu travailler avec des énoncés "essayer avec les ressources". Closeable extends AutoCloseable, essayez-avec-les ressources peuvent être utilisées pour fermer toutes les ressources que la mise à Fermer ou AutoCloseable.

0
répondu remis haroon 2017-08-26 01:26:02