O Java tem uma instrução de uso que pode ser usada ao abrir uma sessão em hibernação?
Em C #, é algo como:
using (var session = new Session())
{
}
Portanto, o objeto sai do escopo e fecha automaticamente.
java
hibernate
using-statement
mrblah
fonte
fonte
using
faz. Escopo não é vitalício (eusing
também não é vitalício, estritamente falando, jáDispose
que não destrói a memória de um objeto.)using statement
.using
, ele automaticamente dispõe o objeto no final de seu escopo, mas não desaloca o objeto - seu tempo de vida não termina até que todas as suas referências tenham desaparecido.Respostas:
Java 7 introduziu o Automatic Resource Block Management, que traz esse recurso para a plataforma Java. As versões anteriores do Java não tinham nada semelhante
using
.Como exemplo, você pode usar qualquer variável implementada
java.lang.AutoCloseable
da seguinte maneira:A
java.io.Closeable
interface do Java , implementada por streams, se estende automaticamenteAutoCloseable
, de forma que você já pode usar streams em umtry
bloco da mesma forma que usaria em umusing
bloco C # . Isso é equivalente a C #using
.A partir da versão 5.0, o Hibernate Sessions implementa
AutoCloseable
e pode ser fechado automaticamente em blocos ARM. Nas versões anteriores do Hibernate Session não implementouAutoCloseable
. Portanto, você precisa estar em Hibernate> = 5.0 para usar este recurso.fonte
using
fazem).AutoCloseable
então ainda não podem usar o ARM.AutoCloseable
não existia antes de java 7, não é?Antes do Java 7 , não existia tal recurso no Java (para Java 7 e superior, veja a resposta de Asaph sobre ARM ).
Você precisava fazer isso manualmente e era uma dor :
E esse é apenas o código quando nem
// Great code
e nemhooray.close()
pode lançar nenhuma exceção.Se você realmente deseja limitar o escopo de uma variável, um bloco de código simples faz o trabalho:
Mas provavelmente não foi isso que você quis dizer.
fonte
// Great code
lançar uma exceção.horray
pode não ter sido inicializado naquele ponto (corrigido agora).Desde Java 7, ele faz: http://blogs.oracle.com/darcy/entry/project_coin_updated_arm_spec
A sintaxe do código em questão seria:
Observe que
Session
precisa implementarAutoClosable
ou uma de suas (muitas) subinterfaces.fonte
Tecnicamente:
fonte
O equivalente java mais próximo é
fonte
Não, Java não possui
using
declaração equivalente.fonte
Por enquanto, não.
Porém existe uma proposta de ARM para Java 7.
fonte
Se você estiver interessado em gerenciamento de recursos, o Projeto Lombok oferece a
@Cleanup
anotação. Retirado diretamente de seu site:Vanilla Java
Com Lombok
fonte
Em java 8 você pode usar try. Por favor, consulte a página seguinte. http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
fonte
Consulte esta lista de palavras-chave Java .
using
palavra-chave infelizmente não faz parte da lista.using
palavra-chave C # por meio de qualquer outra palavra-chave como agora em Java.Para imitar tal
"using"
comportamento, você terá que usar umtry...catch...finally
bloco, onde você descartaria os recursos dentro delefinally
.fonte
using
não ser uma palavra-chave não significa nada. O mesmo recurso pode ser (e será!) Implementado com outra palavra-chave, como @BalusC mencionou.using
não estar na lista de palavras-chave Java significa que esse recurso não está presente na linguagem Java. E isso não é verdade.using
palavra-chave, e nem qualquer equivalência por enquanto. Obrigado @Joachim Sauer! =)Os blocos ARM , da moeda do projeto , estarão em Java 7. Este recurso destina-se a trazer funcionalidade semelhante ao Java como o .Net usando sintaxe.
fonte
Para responder à pergunta sobre limitar o escopo de uma variável, em vez de falar sobre o fechamento / descarte automático de variáveis.
Em Java, você pode definir escopos fechados e anônimos usando chaves. É extremamente simples.
A variável
hooray
está disponível apenas neste escopo, e não fora dele.Isso pode ser útil se você tiver variáveis repetidas que são apenas temporárias.
Por exemplo, cada um com índice. Assim como a
item
variável é fechada no loop for (ou seja, só está disponível dentro dela), aindex
variável é fechada no escopo anônimo.Também uso isso às vezes se você não tiver um loop for para fornecer escopo de variável, mas quiser usar nomes de variáveis genéricos.
fonte