web-dev-qa-db-fra.com

Que signifie méthode idempotente et quels sont les effets secondaires en cas d’appel de la méthode close de Java.lang.AutoCloseable?

La documentation Java de la méthode close () de Java.lang.AutoCloseable dit

 * <p>Note that unlike the {@link Java.io.Closeable#close close}
 * method of {@link Java.io.Closeable}, this {@code close} method
 * is <em>not</em> required to be idempotent.  In other words,
 * calling this {@code close} method more than once may have some
 * visible side effect, unlike {@code Closeable.close} which is
 * required to have no effect if called more than once.

Qu'entendent-ils par méthode idempotente et quels sont les effets secondaires d'appeler deux fois cette méthode close ()? Et puisque l'interface Closeable s'étend à AutoCloseable, pourquoi ne pas voir les effets secondaires dans la fermeture de l'interface Closeable?

22
Aniket Thakur

Idempotent signifie que vous pouvez appliquer l'opération plusieurs fois, mais que l'état résultant d'un appel ne pourra pas être distingué de l'état résultant de plusieurs appels. En bref, il est prudent d'appeler la méthode plusieurs fois. En réalité, les deuxième et troisième appels (et ainsi de suite) n'auront aucun effet visible sur l'état du programme.

Donc, si vous fermez cet objet une fois et qu'il se ferme, vous ne disposez pas d'assez d'informations pour savoir s'il est idempotent. Cependant, si vous le fermez deux fois, et la première fois, il se ferme, mais la deuxième fois, il lève une exception, ce n'est clairement pas idempotent. D'autre part, si vous le fermez une fois et que vous le fermez deux fois, et que la deuxième fermeture fait en sorte que l'élément reste fermé de la même manière (peut-être qu'il s'agisse d'un noop), il est alors idempotent.

Une technique pour créer une Closeable idempotente pourrait être:

public class Example implements Closeable {

  private boolean closed;

  public Example() {
    closed = false;
  }

  public void close() {
    if (!isClosed()) {
      closed = true;
    }
  }

  public boolean isClosed() {
    return closed;
  }
}

Là où il est maintenant évident que si close() est appelé une ou plusieurs fois, tous les retours de l'état via isClosed() deviendront toujours vrais. Par conséquent, la méthode close() serait considérée comme idempotente.

29
Edwin Buck

Explication simple du concept sans code

 Einsteins definition of indempotency

"La définition de la folie fait la même chose encore et encore et attend des résultats différents." - Albert Einstein

Adopter l’aphorisme d’Einstein, c’est l’essentiel de l’idée idempotentielle: faire la même chose encore et encore et obtenir les mêmes résultats. Si vous obtenez des résultats différents, la méthode n'est pas idempotente.

Exemple d'idempotence par analogie quotidienne

Tentative 1

"Please sir, can I have a pay rise?"

"No!"

Même résultat à chaque fois. Demander une augmentation de salaire est une opération idempotente.

Exemples de requêtes HTTP:

  • Faire une demande get: Si elle est correctement implémentée, peu importe le nombre de fois que vous faites cette demande, vous obtiendrez la même réponse.
  • Une opération qui n'est pas idempotente, par exemple, créerait une demande post pour créer une ressource. Chaque fois que vous le ferez, vous modifierez l'état de l'application sur laquelle vous publiez cette application: une nouvelle ressource sera créée chaque fois!

Répondez à votre question:

... il ne devrait y avoir aucun effet secondaire à la fermeture deux fois s'il s'agit d'une méthode idempotente .....

Et c'est aussi simple que ça! J'espère que cela aidera quelqu'un - si vous ne postez pas de commentaire, je vais essayer de le clarifier.

5
BKSpurgeon

GLOSSAIRE Java Idempotent

Si les méthodes sont écrites de manière à ce que les appels répétés à la même méthode ne provoquent pas de mises à jour en double, la méthode est dite "idempotent".

En mathématiques, un élément idempotent, ou un idempotent en abrégé, est tout ce qui, multiplié par lui-même, se donne comme résultat. Par exemple, les deux seuls nombres réels idempotents sont 0 et 1.

Dans la conception de l’interface utilisateur, un bouton peut être appelé "idempotent" si l’appuyer plusieurs fois aura le même effet que l’appuyer une fois. Par exemple, un bouton "Pause" n'est pas idempotent s'il bascule l'état en pause. Par ailleurs, si vous appuyez plusieurs fois sur cette touche pour que le système reste en pause et que vous continuiez à appuyer sur «Play», «Pause» est alors idempotent. Ceci est utile dans des interfaces telles que les télécommandes infrarouges et les écrans tactiles, où l'utilisateur peut ne pas être sûr d'avoir appuyé sur le bouton et le réappuyer. Les touches d’appel d’ascenseur sont également idempotentes, bien que beaucoup de gens pensent que non. 

Ressource: - http://www.allapplabs.com/glossary/idempotent.htm

1
Rahul Agrawal