web-dev-qa-db-fra.com

Java a-t-il une instruction using?

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.

83
mrblah

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é.

100
Asaph

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.

27
Joachim Sauer

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.

16
riwi

Techniquement:

DisposableObject d = null;
try {
    d = new DisposableObject(); 
}
finally {
    if (d != null) {
        d.Dispose();
    }
}
8
ChaosPandion

L'équivalent Java le plus proche est

AwesomeClass hooray = new AwesomeClass();
try{
    // Great code
} finally {
    hooray.dispose(); // or .close(), etc.
}
8

Non, Java n'a pas d'équivalent d'instruction using.

3
Rich Adams

Pour l'instant, non.

Cependant, il existe une proposition de BRAS pour Java 7.

3
missingfaktor

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);
    }
  }
}
_
2
Adam Paynter

Veuillez voir ceci Liste des mots-clés Java .

  1. Le mot clé using ne fait malheureusement pas partie de la liste.
  2. Et il n'y a pas non plus d'équivalence du mot clé C # 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.

1
Will Marcouiller

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.

1
krock

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

1
user232343

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);
}
0
Alex