Czy Java ma instrukcję using, której można użyć podczas otwierania sesji w stanie hibernacji?
W C # jest to coś takiego:
using (var session = new Session())
{
}
Więc obiekt wychodzi poza zasięg i zamyka się automatycznie.
java
hibernate
using-statement
mrblah
źródło
źródło
using
robi. Zakres nie jest życiem (iusing
nie dotyczy też życia, ściśle mówiąc, ponieważDispose
nie niszczy pamięci obiektu.)using statement
.using
, automatycznie usuwa obiekt na końcu jego zakresu, ale nie zwalnia obiektu - jego żywotność nie kończy się, dopóki wszystkie jego odniesienia nie znikną.Odpowiedzi:
Java 7 wprowadziła automatyczne zarządzanie blokami zasobów, które przenosi tę funkcję na platformę Java. Poprzednie wersje Javy nie miały nic podobnego
using
.Jako przykład możesz użyć dowolnej zmiennej implementującej
java.lang.AutoCloseable
w następujący sposób:java.io.Closeable
Interfejs Java , zaimplementowany przez strumienie, automatycznie się rozszerzaAutoCloseable
, więc możesz już używać strumieni wtry
bloku w taki sam sposób, jak wusing
bloku C # . Jest to odpowiednik C #using
.Począwszy od wersji 5.0, sesje hibernacji implementują
AutoCloseable
i mogą być automatycznie zamykane w blokach ARM. W poprzednich wersjach Hibernate Session nie zaimplementowanoAutoCloseable
. Aby móc korzystać z tej funkcji, musisz być w trybie Hibernate> = 5.0.źródło
using
robi).AutoCloseable
więc nie mogą jeszcze używać ARM.AutoCloseable
nie istniał przed Java 7, prawda?Przed Java 7 , nie było żadnego z takich funkcji w Java (Java 7, a nawet zobaczyć Asafa odpowiedź „s dotyczącą ARM ).
Trzeba było to zrobić ręcznie i było to uciążliwe :
I to tylko kod, w którym ani
// Great code
ani niehooray.close()
mogą zgłaszać żadnych wyjątków.Jeśli naprawdę chcesz ograniczyć zakres zmiennej, wystarczy prosty blok kodu:
Ale prawdopodobnie nie to miałeś na myśli.
źródło
// Great code
zgłosi wyjątek.horray
mógł nie zostać zainicjowany w tym momencie (teraz naprawiony).Od Java 7 to robi: http://blogs.oracle.com/darcy/entry/project_coin_updated_arm_spec
Składnia kodu w pytaniu byłaby następująca:
Zauważ, że
Session
musi zaimplementowaćAutoClosable
jeden z (wielu) interfejsów podrzędnych.źródło
Technicznie:
źródło
Najbliższy odpowiednik Java to
źródło
Nie, Java nie ma
using
odpowiednika instrukcji.źródło
Na razie nie.
Istnieje jednak propozycja ARM dla Java 7.
źródło
Jeśli interesuje Cię zarządzanie zasobami, Project Lombok oferuje
@Cleanup
adnotację. Zrobione bezpośrednio z ich witryny:Vanilla Java
Z Lombok
źródło
W java 8 możesz użyć try. Proszę zapoznać się z następną stroną. http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
źródło
Zobacz tę listę słów kluczowych Java .
using
słowo kluczowe niestety nie jest częścią listy.using
słowa kluczowego C # z jakimkolwiek innym słowem kluczowym, jak na razie w Javie.Aby naśladować takie
"using"
zachowanie, będziesz musiał użyćtry...catch...finally
bloku, w którym pozbyłeś się zasobówfinally
.źródło
using
nie jest to słowo kluczowe, nic nie znaczy. Ta sama funkcja może być (i będzie!) Zaimplementowana za pomocą innego słowa kluczowego, jak wspomniano w @BalusC.using
nie ma go na liście słów kluczowych Java, oznacza, że ta funkcja nie jest obecna w języku Java. To nieprawda.using
słowa kluczowego i na razie nie ma odpowiednika. Dzięki @Joachim Sauer! =)Bloki ARM z monety projektu będą w Javie 7. Ta funkcja ma przynieść podobną funkcjonalność do Javy, co .Net przy użyciu składni.
źródło
Aby odpowiedzieć na pytanie dotyczące ograniczania zakresu zmiennej, zamiast mówić o automatycznym zamykaniu / usuwaniu zmiennych.
W Javie można definiować zamknięte, anonimowe zakresy za pomocą nawiasów klamrowych. To niezwykle proste.
Zmienna
hooray
jest dostępna tylko w tym zakresie, a nie poza nim.Może to być przydatne, jeśli masz powtarzające się zmienne, które są tylko tymczasowe.
Na przykład każdy z index. Tak jak
item
zmienna jest zamykana w pętli for (tj. Jest dostępna tylko w niej), takindex
zmienna jest zamykana w zakresie anonimowym.Używam tego również czasami, jeśli nie masz pętli for, aby zapewnić zakres zmiennych, ale chcesz używać ogólnych nazw zmiennych.
źródło