Est-ce que Java a une instruction using qui peut être utilisée lors de l’ouverture d’une session dans hibernate?
En C #, c'est quelque chose comme:
using (var session = new Session())
{
}
Donc, l'objet sort du cadre et se ferme automatiquement.
Java 7 introduit Gestion automatique des blocs de ressources qui apporte cette fonctionnalité à la plate-forme Java. Les versions précédentes de Java n'avaient rien qui ressemble à using
.
Par exemple, vous pouvez utiliser n’importe quelle variable implémentant Java.lang.AutoCloseable
de la manière suivante:
try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
...
}
L'interface Java.io.Closeable
de Java, implémentée par les flux, étend automatiquement AutoCloseable
, de sorte que vous pouvez déjà utiliser des flux dans un bloc try
de la même façon que vous les utiliseriez dans un bloc C # using
. Ceci est équivalent à la variable using
de C #.
À partir de version 5.0, les sessions Hibernate implémentent AutoCloseable
et peuvent être fermées automatiquement par blocs ARM. Dans les versions précédentes de Hibernate Session, AutoCloseable
n'était pas implémenté. Vous devez donc être sur Hibernate> = 5.0 pour pouvoir utiliser cette fonctionnalité.
Avant Java 7, il y avait no telle fonctionnalité en Java (pour Java 7 et supérieur, voir la réponse de Asaph concernant ARM).
Vous deviez le faire manuellement et il était pénible:
AwesomeClass hooray = null;
try {
hooray = new AwesomeClass();
// Great code
} finally {
if (hooray!=null) {
hooray.close();
}
}
Et ce n'est que le code lorsque ni // Great code
ni hooray.close()
ne peuvent renvoyer une exception.
Si vous vraiment ne voulez que limiter la portée d'une variable, alors un simple bloc de code fait le travail:
{
AwesomeClass hooray = new AwesomeClass();
// Great code
}
Mais ce n'est probablement pas ce que vous vouliez dire.
Depuis Java 7, il fait: http://blogs.Oracle.com/darcy/entry/project_coin_updated_arm_spec
La syntaxe du code dans la question serait la suivante:
try (Session session = new Session())
{
// do stuff
}
Notez que Session
doit implémenter AutoClosable
ou l’une de ses (nombreuses) sous-interfaces.
Techniquement:
DisposableObject d = null;
try {
d = new DisposableObject();
}
finally {
if (d != null) {
d.Dispose();
}
}
L'équivalent Java le plus proche est
AwesomeClass hooray = new AwesomeClass();
try{
// Great code
} finally {
hooray.dispose(); // or .close(), etc.
}
Non, Java n'a pas d'équivalent d'instruction using
.
Pour l'instant, non.
Cependant, il existe une proposition de BRAS pour Java 7.
Si vous êtes intéressé par la gestion des ressources, Project Lombok propose l'annotation @Cleanup
. Tiré directement de leur site:
Vous pouvez utiliser _
@Cleanup
_ pour vous assurer qu'une ressource donnée est automatiquement nettoyée avant que le chemin d'exécution du code ne quitte votre portée actuelle. Pour ce faire, vous annotez toute déclaration de variable locale avec l'annotation _@Cleanup
_ comme suit:
@Cleanup InputStream in = new FileInputStream("some/file");
Par conséquent, à la fin de l'étendue dans laquelle vous vous trouvez,
in.close()
est appelée. Cet appel est garanti pour être exécuté via une construction try/finally. Regardez l'exemple ci-dessous pour voir comment cela fonctionne.Si le type d'objet que vous souhaitez nettoyer n'a pas de méthode
close()
, mais une autre méthode sans argument, vous pouvez spécifier le nom de cette méthode de la manière suivante:
@Cleanup("dispose") org.Eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
Par défaut, la méthode de nettoyage est supposée être
close()
. Une méthode de nettoyage utilisant un argument ne peut pas être appelée via _@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();
}
}
}
_
Avec Lombok
_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);
}
}
}
_
Veuillez voir ceci Liste des mots-clés Java .
using
ne fait malheureusement pas partie de la liste.using
avec un autre mot clé, pour l'instant en Java.Pour imiter un tel comportement "using"
, vous devrez utiliser un bloc try...catch...finally
, dans lequel vous disposeriez des ressources dans finally
.
ARM blocs , à partir de project pièce seront en Java 7. Cette fonctionnalité est destinée à apporter une fonctionnalité similaire à Java comme la syntaxe de .Net.
En Java 8, vous pouvez utiliser try. Veuillez vous référer à la page suivante. http://docs.Oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
Répondre à la question concernant la portée limitée d’une variable, au lieu de parler de fermeture/suppression automatique de variables.
Dans Java, vous pouvez définir des étendues fermées et anonymes à l'aide d'accolades. C'est extrêmement simple.
{
AwesomeClass hooray = new AwesomeClass()
// Great code
}
La variable hooray
est uniquement disponible dans cette étendue et non en dehors de celle-ci.
Cela peut être utile si vous avez des variables répétitives qui ne sont que temporaires.
Par exemple, chacun avec index. Tout comme la variable item
est fermée sur la boucle for (c'est-à-dire qu'elle n'est disponible qu'à l'intérieur de celle-ci), la variable index
est fermée sur la portée anonyme.
// 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
}
}
J'utilise aussi parfois cela si vous n'avez pas de boucle for pour fournir une portée de variable, mais que vous voulez utiliser des noms de variable génériques.
{
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);
}