Имеет ли 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);
}