Подтвердить что ты не робот

Имеет ли Java инструкцию using?

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

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

using (var session = new Session())
{


}

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

4b9b3361

Ответ 1

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.

Ответ 2

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

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

Ответ 3

Так как Java 7: http://blogs.oracle.com/darcy/entry/project_coin_updated_arm_spec

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

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

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

Ответ 4

Технически:

DisposableObject d = null;
try {
    d = new DisposableObject(); 
}
finally {
    if (d != null) {
        d.Dispose();
    }
}

Ответ 5

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

AwesomeClass hooray = new AwesomeClass();
try{
    // Great code
} finally {
    hooray.dispose(); // or .close(), etc.
}

Ответ 6

Нет, Java не имеет эквивалентного выражения using.

Ответ 7

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

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

Ответ 8

Если вы заинтересованы в управлении ресурсами, Проект 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);
    }
  }
}

Ответ 9

См. этот Список ключевых слов Java.

  • Ключевое слово using, к сожалению, не входит в список.
  • И также нет эквивалентности ключевого слова С# using через любое другое ключевое слово, как сейчас на Java.

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

Ответ 10

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

Ответ 12

Чтобы ответить на вопрос об ограничении области действия переменной, вместо того, чтобы говорить об автоматических закрывающих/распоряжающихся переменных.

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