Имеет ли Java оператор using, который можно использовать при открытии сеанса в спящем режиме?
В С# это что-то вроде:
using (var session = new Session())
{
}
Таким образом, объект выходит за пределы области видимости и автоматически закрывается.
Имеет ли Java оператор using, который можно использовать при открытии сеанса в спящем режиме?
В С# это что-то вроде:
using (var session = new Session())
{
}
Таким образом, объект выходит за пределы области видимости и автоматически закрывается.
Java 7 внедрила Автоматическое управление блоками ресурсов, которое добавляет эту функцию на платформу Java. Предыдущие версии Java не имели ничего похожего на using.
В качестве примера вы можете использовать любую переменную, реализующую java.lang.AutoCloseable следующим образом:
try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
    ...
}
Интерфейс Java java.io.Closeable, реализованный потоками, автоматически расширяется AutoCloseable, поэтому вы уже можете использовать потоки в блоке try так же, как использовать их в блоке С# using. Это эквивалентно С# using.
Начиная с версия 5.0, сеансы Hibernate выполняют AutoCloseable и могут быть автоматически закрыты в блоках ARM. В предыдущих версиях Hibernate сеанс не реализовал AutoCloseable. Поэтому для использования этой функции вам нужно быть в Hibernate >= 5.0.
До 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 7: http://blogs.oracle.com/darcy/entry/project_coin_updated_arm_spec
Синтаксис кода в вопросе будет следующим:
try (Session session = new Session())
{
  // do stuff
}
Обратите внимание, что Session необходимо реализовать AutoClosable или один из его (многих) суб-интерфейсов.
Технически:
DisposableObject d = null;
try {
    d = new DisposableObject(); 
}
finally {
    if (d != null) {
        d.Dispose();
    }
}
		Ближайший эквивалент java
AwesomeClass hooray = new AwesomeClass();
try{
    // Great code
} finally {
    hooray.dispose(); // or .close(), etc.
}
		Нет, Java не имеет эквивалентного выражения using.
На данный момент нет.
Однако есть предложение ARM для Java 7.
Если вы заинтересованы в управлении ресурсами, Проект Lombok предлагает @Cleanup. Принимаются непосредственно со своего сайта:
Вы можете использовать
@Cleanupдля обеспечения заданного ресурс автоматически очищается до того, как завершится путь выполнения кода ваш текущий объем. Вы делаете это аннотирование любой локальной переменной с помощью@Cleanupаннотации следующим образом:
@Cleanup InputStream in = new FileInputStream("some/file");Как результат, в конце области действия вы in,
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();
    }
  }
}
С Ломбоком
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.
using, к сожалению, не входит в список.using через любое другое ключевое слово, как сейчас на Java.Чтобы имитировать такое поведение "using", вам нужно будет использовать блок try...catch...finally, в котором вы будете распоряжаться ресурсами внутри finally.
блоки ARM, из монета проекта будет быть в Java 7. Эта функция предназначена для обеспечения аналогичной функциональности Java как синтаксиса .Net.
В java 8 вы можете использовать try. См. Следующую страницу. http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
Чтобы ответить на вопрос об ограничении области действия переменной, вместо того, чтобы говорить об автоматических закрывающих/распоряжающихся переменных.
В Java вы можете определить закрытые анонимные области с помощью фигурных скобок. Это очень просто.
{
   AwesomeClass hooray = new AwesomeClass()
   // Great code
}
Переменная hooray доступна только в этой области, а не вне ее.
Это может быть полезно, если вы повторяете переменные, которые являются временными.
Например, каждый с индексом. Так же, как переменная item закрывается по циклу for (т.е. Доступна только внутри нее), переменная index закрывается в анонимной области.
// first loop
{
    Integer index = -1;
    for (Object item : things) {index += 1;
        // ... item, index
    }
}
// second loop
{
    Integer index = -1;
    for (Object item : stuff) {index += 1;
        // ... item, index
    }
}
Я также иногда использую это, если у вас нет цикла for для предоставления области переменных, но вы хотите использовать имена обобщенных переменных.
{
    User user = new User();
    user.setId(0);
    user.setName("Andy Green");
    user.setEmail("[email protected]");
    users.add(user);
}
{
    User user = new User();
    user.setId(1);
    user.setName("Rachel Blue");
    user.setEmail("[email protected]");
    users.add(user);
}