Что означает идемпотентный метод и каковы побочные эффекты в случае вызова метода close из java.lang.AutoCloseable?
Документы Java о методе close() 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.
Что они подразумевают под идемпотентным методом и каковы побочные эффекты от вызова этого метода close() дважды? А поскольку интерфейс Closeable расширяет AutoCloseable, почему побочные эффекты не видны при закрытии интерфейса Closeable?
4 ответа
Идемпотент означает, что вы можете применить операцию несколько раз, но результирующее состояние одного вызова будет неотличимо от результирующего состояния нескольких вызовов. Короче говоря, безопасно вызывать метод несколько раз. По сути, второй и третий (и т. Д.) Вызовы не окажут видимого влияния на состояние программы.
Поэтому, если вы закрываете этот объект один раз, и он закрывается, у вас недостаточно информации, чтобы узнать, является ли он идемпотентным. Однако, если вы закрываете его дважды, и в первый раз он закрывается, а во второй раз выдает исключение, он явно не идемпотентен. С другой стороны, если вы закрываете его один раз и закрываете его дважды, а второе закрытие приводит к тому, что элемент остается закрытым таким же образом (возможно, это не что иное), то он идемпотентен.
Одна техника изготовления идемпотента Closeable
может быть:
public class Example implements Closeable {
private boolean closed;
public Example() {
closed = false;
}
public void close() {
if (!isClosed()) {
closed = true;
}
}
public boolean isClosed() {
return closed;
}
}
Где теперь очевидно, что если close()
вызывается один или несколько раз, все возвраты состояния через isClosed()
навсегда вернет истину. Поэтому метод close()
будет считаться идемпотентом.
Я объясню основную концепцию:
Что такое идемпотентность?
"Определение безумия - это делать одно и то же снова и снова и ожидать разных результатов". - Альберт Эйнштейн
Принять афоризм Эйнштейна - вот основной смысл идемпотентности: делать одно и то же снова и снова и получать одни и те же результаты. Если вы получите разные результаты, то метод не идемпотентен.
Пример идемпотентности
Попытка 1
"Please sir, can I have a pay rise?"
"No!"
Один и тот же результат каждый раз.
Чтобы ответить на ваш вопрос..
... не должно быть никаких побочных эффектов закрытия дважды, если это идемпотентный метод..... И это так просто! Надеюсь, это кому-нибудь поможет.
ЯВА ГЛОССАРИЙ Идемпотент
Если методы написаны таким образом, что повторные вызовы одного и того же метода не вызывают повторных обновлений, метод считается "идемпотентным".
В математике идемпотентный элемент или идемпотент для краткости - это все, что при умножении на себя дает сам результат. Например, только два действительных числа, которые являются идемпотентами, это 0 и 1.
В дизайне пользовательского интерфейса кнопку можно назвать "идемпотентом", если нажатие на нее более одного раза будет иметь тот же эффект, что и нажатие на нее один раз. Например, кнопка "Пауза" не идемпотентна, если она переключает состояние паузы. С другой стороны, если нажатие несколько раз удерживает систему в режиме паузы, а нажатие кнопки "Воспроизведение" возобновляется, то "Пауза" является идемпотентной. Это полезно в таких интерфейсах, как инфракрасные пульты дистанционного управления и сенсорные экраны, где пользователь может быть не уверен в успешном нажатии кнопки и может нажать ее снова. Кнопки вызова лифта также являются идемпотентными, хотя многие думают, что это не так.
IDEMPOTENT Методы
HTTP-метод является импотентным, если результат становится одинаковым для каждого вызова. Когда вы вызываете любой запрос n раз, результат будет таким же.
Возьмем пример, что добавление НОЛЯ к любому числу будет тем же самым результатом.
HTTP-методы делятся на два типа.
- Безопасно повторяемый ( идемпотентный )
- Невозможно безопасно повторить ( неидемпотентный )
Безопасно повторяемый ( идемпотентный ): вызывайте метод в любое время, он дает тот же результат. это называется идемпотентными методами.
GET, PUT, DELETE HTTP-метод, который называется идемпотентным методом. Так как
Метод GET : получение ресурса. Метод PUT : он обновит один ресурс. Метод DELETE : он будет использоваться для удаления отдельного ресурса, не влияя на другой ресурс.
Невозможно безопасно повторить ( неидемпотентный )
Но когда вызывается метод POST. Метод POST будет каждый раз создавать новый ресурс. Поэтому он назван Неидемпотентным