Java имеет оператор использования?

Java имеет оператор использования, который может использоваться, когда открытие сессии в в спящем режиме?

В C# это - что-то как:

using (var session = new Session())
{


}

Таким образом, объект выходит из объема и завершений автоматически.

97
задан Asaph 3 June 2016 в 15:28
поделиться

9 ответов

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.

113
ответ дан 24 November 2019 в 05:26
поделиться

Нет, у Java нет эквивалента с использованием .

3
ответ дан 24 November 2019 в 05:26
поделиться

Технически:

DisposableObject d = null;
try {
    d = new DisposableObject(); 
}
finally {
    if (d != null) {
        d.Dispose();
    }
}
8
ответ дан 24 November 2019 в 05:26
поделиться

С этого момента, нет.

Однако имеется предложение ARM для Java 7.

3
ответ дан 24 November 2019 в 05:26
поделиться

Если вас интересует управление ресурсами, Проект Ломбок предлагает @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);
    }
  }
}
2
ответ дан 24 November 2019 в 05:26
поделиться

До 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
}

Но это, вероятно, не то, что вы имели в виду.

29
ответ дан 24 November 2019 в 05:26
поделиться

Пожалуйста, посмотрите этот Список ключевых слов Java.

  1. Ключевое слово using, к сожалению, не входит в этот список.
  2. А также нет эквивалентности ключевого слова C# using через любое другое ключевое слово, как пока в Java.

Чтобы имитировать такое "using" поведение, вам придется использовать try...catch...finally блок, где вы будете избавляться от ресурсов внутри finally.

1
ответ дан 24 November 2019 в 05:26
поделиться

Ближайший Java-эквивалент -

AwesomeClass hooray = new AwesomeClass();
try{
    // Great code
} finally {
    hooray.dispose(); // or .close(), etc.
}
8
ответ дан 24 November 2019 в 05:26
поделиться

ARM блоки, из проекта coin будут в Java 7. Эта функция призвана привнести в Java функциональность, аналогичную синтаксису .Net.

1
ответ дан 24 November 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: