Java имеет оператор использования, который может использоваться, когда открытие сессии в в спящем режиме?
В C# это - что-то как:
using (var session = new Session())
{
}
Таким образом, объект выходит из объема и завершений автоматически.
Java 7 представила Автоматическое управление ресурсными блоками , которое переносит эту функцию на платформу Java. В предыдущих версиях Java не было ничего похожего на с использованием
.
В качестве примера можно использовать любую переменную, реализующую java.lang.AutoCloseable
следующим образом:
try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
...
}
интерфейс Java java.io.Closeable
, реализованный потоками, автоматически расширяет AutoCloseable
, так что вы уже можете использовать потоки в блоке try
так же, как вы бы использовали их в блоке C# , используя
. Это эквивалентно C# с использованием
.
Начиная с версии 5.0 , в спящем сеансе реализована функция AutoCloseable
, которая может быть автоматически закрыта в блоках ARM. В предыдущих версиях спящего режима сеанс не реализовывал AutoCloseable
. Поэтому для использования этой функции необходимо находиться в спящем режиме >= 5.0.
Технически:
DisposableObject d = null;
try {
d = new DisposableObject();
}
finally {
if (d != null) {
d.Dispose();
}
}
С этого момента, нет.
Однако имеется предложение ARM для Java 7.
Если вас интересует управление ресурсами, Проект Ломбок предлагает @Cleanup
аннотацию. Взято прямо с их сайта:
Вы можете использовать
@Cleanup
, чтобы гарантировать, что данный ресурс автоматически очищается до того, как путь выполнения кода выйдет за пределы вашей текущей области видимости. Для этого нужно аннотируя любую локальную переменную@Cleanup
@Cleanup InputStream in = new FileInputStream("some/file");
В результате В результате, в конце области видимости, в которой вы находитесь вызывается
in.close()
. Этот вызов гарантированно выполняется посредством конструкции try/finally. Посмотрите на пример ниже, чтобы увидеть, как это работает.Если тип объекта, который вы хотите очистить, не имеет
close()
метод, а какой-то другой метод без аргумента метод, вы можете указать имя этого метода следующим образом:
@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
По умолчанию предполагается, что методом очистки является
close()
. Метод очистки, принимающий аргумент, не может быть вызван через@Cleanup
.
Vanilla Java
import java.io.*;
public class CleanupExample {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream(args[0]);
try {
OutputStream out = new FileOutputStream(args[1]);
try {
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
} finally {
out.close();
}
} finally {
in.close();
}
}
}
С Lombok
import lombok.Cleanup;
import java.io.*;
public class CleanupExample {
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
}
До Java 7 в Java не было такой возможности (для Java 7 и выше см. ответ Asaph относительно ARM).
Вам нужно было делать это вручную, и это было мучением:
AwesomeClass hooray = null;
try {
hooray = new AwesomeClass();
// Great code
} finally {
if (hooray!=null) {
hooray.close();
}
}
И это только код, когда ни // Great code
, ни hooray.close()
не могут выбросить никаких исключений.
Если вы действительно хотите ограничить область видимости переменной, то простой блок кода справится с этой задачей:
{
AwesomeClass hooray = new AwesomeClass();
// Great code
}
Но это, вероятно, не то, что вы имели в виду.
Пожалуйста, посмотрите этот Список ключевых слов Java.
using
, к сожалению, не входит в этот список. using
через любое другое ключевое слово, как пока в Java. Чтобы имитировать такое "using"
поведение, вам придется использовать try...catch...finally
блок, где вы будете избавляться от ресурсов внутри finally
.
Ближайший Java-эквивалент -
AwesomeClass hooray = new AwesomeClass();
try{
// Great code
} finally {
hooray.dispose(); // or .close(), etc.
}
ARM блоки, из проекта coin будут в Java 7. Эта функция призвана привнести в Java функциональность, аналогичную синтаксису .Net.