Имеет ли Java инструкцию using?
Имеет ли Java оператор using, который можно использовать при открытии сеанса в спящем режиме?
В С# это что-то вроде:
using (var session = new Session())
{
}
Таким образом, объект выходит за пределы области видимости и автоматически закрывается.
Ответы
Ответ 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.
Ответ 11
В java 8 вы можете использовать try. См. Следующую страницу. http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
Ответ 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);
}