Есть ли в Java оператор использования? - PullRequest
92 голосов
/ 07 января 2010

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

В C # это что-то вроде:

using (var session = new Session())
{


}

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

Ответы [ 12 ]

108 голосов
/ 07 января 2010

Java 7 представил Автоматическое управление блоками ресурсов , которое переносит эту функцию на платформу Java. Предыдущие версии Java не имели ничего похожего на using.

Например, вы можете использовать любую переменную, реализующую java.lang.AutoCloseable следующим образом:

try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
    ...
}

Интерфейс Java java.io.Closeable, реализованный потоками, автоматически расширяет AutoCloseable, поэтому вы уже можете использовать потоки в блоке try так же, как вы используете их в блоке C # using. Это эквивалентно C # using.

Начиная с версии 5.0, Hibernate Sessions реализует AutoCloseable и может автоматически закрываться в блоках ARM. В предыдущих версиях Hibernate Session не реализовывался AutoCloseable. Так что вам нужно быть в Hibernate> = 5.0, чтобы использовать эту функцию.

28 голосов
/ 31 мая 2010

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

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

17 голосов
/ 24 августа 2011

Начиная с Java 7: http://blogs.oracle.com/darcy/entry/project_coin_updated_arm_spec

Синтаксис кода в вопросе будет следующим:

try (Session session = new Session())
{
  // do stuff
}

Обратите внимание, что Session необходимо реализовать AutoClosable или один из его (многих) подчиненных интерфейсов.

8 голосов
/ 31 мая 2010

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

AwesomeClass hooray = new AwesomeClass();
try{
    // Great code
} finally {
    hooray.dispose(); // or .close(), etc.
}
8 голосов
/ 07 января 2010

Технически:

DisposableObject d = null;
try {
    d = new DisposableObject(); 
}
finally {
    if (d != null) {
        d.Dispose();
    }
}
3 голосов
/ 07 января 2010

На данный момент нет.

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

3 голосов
/ 07 января 2010

Нет, Java не имеет using эквивалента оператора.

2 голосов
/ 13 августа 2014

В Java 8 вы можете использовать попробовать. Пожалуйста, обратитесь к следующей странице. http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

2 голосов
/ 31 мая 2010

Если вы заинтересованы в управлении ресурсами, Project Lombok предлагает аннотацию @Cleanup. Взято прямо с их сайта:

Вы можете использовать @Cleanup для обеспечения заданного ресурс автоматически очищается до выхода из пути выполнения кода ваша текущая сфера Вы делаете это аннотирование любой локальной переменной декларация с @Cleanup аннотация вот так:

@Cleanup InputStream in = new FileInputStream("some/file");

Как результат, в конце области вы в, in.close() называется. Этот звонок гарантированно работать через попробуйте / наконец-то построить. Посмотрите на Пример ниже, чтобы увидеть, как это работает.

Если тип объекта, который вы хотели бы очистка не имеет close() метод, но некоторые другие без аргументов метод, вы можете указать имя этот метод примерно так:

@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);

По умолчанию метод очистки считается close(). Метод очистки, который требует аргумент не может быть вызван через @Cleanup.

Ванильная Ява

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();
    }
  }
}

С Ломбоком

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);
    }
  }
}
1 голос
/ 31 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...