2013-10-11 19 views
19

docs Java di close() metodo java.lang.AutoCloseable diceCosa significa metodo idempotente e quali sono gli effetti collaterali in caso di chiamata al metodo close di java.lang.AutoCloseable?

* <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. 

cosa si intende con il metodo idempotente e quali sono gli effetti collaterali di chiamare questo metodo close() due volte? E poiché l'interfaccia Closeable estende AutoCloseable perché gli effetti collaterali non sono visibili nella chiusura dell'interfaccia Closeable?

+2

idempotent in un contesto di programmazione significa che si può ripetere tranquillamente un'operazione. Ad esempio, è possibile emettere la stessa richiesta HTTP GET più volte senza timore di effetti collaterali (presupponendo che sia stata implementata correttamente sul server). –

+0

Significa che è possibile ripetere quell'operazione 'n' volte e ottenere sempre lo stesso risultato, in Http idempotent metodo esempio è GET – RamonBoza

+1

@RamonBoza Sì, assumendo che il server non cambi la risorsa restituita, e che il client web non 'contare le richieste, e che l'ultima richiesta non è tracciata, ecc. Un esempio migliore sarebbe 'public int add (int first, int second) {return first + second; } 'Due chiamate successive non cambierebbero di certo lo stato del programma, in quanto il programma non modifica nemmeno il suo stato. Un altro esempio 'void close() {if (! Closed) {file.close(); closed = true; }} 'come cambia stato nella prima chiamata, ma lo stato rimane identico nelle chiamate successive. –

risposta

25

Idempotente significa che è possibile applicare l'operazione un numero di volte, ma lo stato risultante di una chiamata sarà indistinguibile dallo stato risultante di più chiamate. In breve, è sicuro chiamare il metodo più volte. In effetti le chiamate seconda e terza (e così via) non avranno alcun effetto visibile sullo stato del programma.

Quindi, se si chiude l'oggetto una volta, e si chiude, non si dispone di informazioni sufficienti per sapere se è idempotente. Tuttavia, se lo chiudi due volte e la prima volta che si chiude, ma la seconda volta genera un'eccezione, non è chiaramente idempotente. D'altra parte, se si chiude una volta, e chiudere due volte, e la seconda dei risultati di chiusura nella voce rimanendo chiuso nello stesso modo (forse è un noop), allora è idempotente.

Una tecnica di fare un idempotent Closeable potrebbe essere:

public class Example implements Closeable { 

    private boolean closed; 

    public Example() { 
    closed = false; 
    } 

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

    public boolean isClosed() { 
    return closed; 
    } 
} 

dove è ora evidente che se close() si chiama una o più volte, tutti i ritorni dello stato attraverso isClosed() sarà per sempre restituire true. Pertanto, il metodo close() sarebbe considerato idempotente.

+0

Ha senso. Grazie! –

+0

Si noti inoltre che questa è [** una ** interpretazione del termine "idempotente"] (http://stackoverflow.com/a/1077421/632951). "idempotente" ha altri significati in diversi contesti. – Pacerier

+1

@Pacerier È anche la descrizione quasi parola per parola della prima frase della correzione. Se si utilizza l'approccio teoria matematica all'analisi di calcolo, è ancora questa definizione, anche se con minore riformulazione 'f (f (x)) = f (x)', che se si parla di matematica vuol dire "se si preforme l'operazione' f' su 'x' due volte, è come eseguire l'operazione' f' su 'x' una volta. –

4

ti spiego il concetto di base:

Qual è idempotenza?

Einsteins definition of indempotency

'La definizione di follia sta facendo la stessa cosa più e più volte e aspettarsi risultati diversi.' - Albert Einstein

Per adottare l'aforisma di Einstein, questo è l'essenza fondamentale dell'idempotenza: fare sempre la stessa cosa e ottenere gli stessi risultati. Se si ottengono risultati diversi, il metodo non è idempotente.

Esempio di idempotenza

Tentativo 1

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

"No!" 

Stesso risultato ogni volta.

Per rispondere alla tua domanda ..

... non ci dovrebbero essere effetti collaterali di chiusura due volte se si tratta di un metodo di idempotente ..... Ed è così semplice come sembra! Spero che questo aiuti qualcuno.

0

JAVA GLOSSARIO idempotent

Se i metodi sono scritti in modo tale che ripete le chiamate verso lo stesso metodo non causano gli aggiornamenti duplicati, il metodo è detto di essere "idempotent."

In matematica un elemento idempotente, o un idempotente in breve, è qualcosa che, quando moltiplicato per se stesso, si dà come risultato. Ad esempio, gli unici due numeri reali che sono idempotente sono 0 e 1.

Nella progettazione dell'interfaccia utente, un pulsante può essere chiamato "idempotente" se premuto più di una volta avrà lo stesso effetto della pressione una volta. Ad esempio, un pulsante "Pausa" non è idempotente se commuta lo stato di pausa. D'altra parte, se premendolo più volte, il sistema si ferma e premendo "Play" riprende, quindi "Pausa" è idempotente. Ciò è utile in interfacce come i telecomandi a infrarossi e touch screen in cui l'utente potrebbe non essere sicuro di aver premuto il pulsante correttamente e potrebbe premere di nuovo. I pulsanti di chiamata dell'elevatore sono anche idempotenti, anche se molte persone pensano di no.

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

Problemi correlati