60 votes

"using" mot-clé en java

En Java, existe-t-il un équivalent de l' instruction "using" du C # permettant de définir une portée pour un objet:

 using (AwesomeClass hooray = new AwesomeClass())
{
   // Great code
}
 

94voto

BalusC Points 498232

Il y a maintenant une telle fonctionnalité, qui est venu en Java 7 "Automatique de Gestion des Ressources" (BRAS) à l'aide de l' try mot-clé le cadre du Projet de Pièce de monnaie, JSR 334). E. g.

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
   return br.readLine();
}

Les ressources pour mettre en œuvre java.lang.AutoCloseable.

Voir aussi:


Mise à jour: Java 7 a été pendant un certain temps et Eclipse Indigo SR1 prend désormais en charge le nouveau Java 7 fonctionnalités, y compris le BRAS.

18voto

Joachim Sauer Points 133411

Avant Java 7, il n'y a pas de telle fonction en Java (Java 7 et voir BalusC's réponse concernant le BRAS).

Vous avez besoin de le faire manuellement et c' était une douleur:

AwesomeClass hooray = null;
try {
  hooray = new AwesomeClass();
  // Great code
} finally {
  if (hooray!=null) {
    hooray.close();
  }
}

Et c'est juste le code quand ni // Great code ni hooray.close() peut lancer des exceptions.

Si vous vraiment voulez seulement limite la portée d'une variable, alors qu'un simple bloc de code fait le travail:

{
  AwesomeClass hooray = new AwesomeClass();
  // Great code
}

Mais ce n'est probablement pas ce que vous voulez dire.

8voto

Michael Borgwardt Points 181658

L'équivalent Java le plus proche est

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

2voto

Adam Paynter Points 22056

Si vous êtes intéressé dans la gestion des ressources, le Projet de Lombok offre l' @Cleanup d'annotation. Prises directement à partir de leur site:

Vous pouvez utiliser @Cleanup afin d'assurer une la ressource est automatiquement nettoyé avant le chemin d'exécution de code sorties votre champ d'application actuel. Pour ce faire, vous l'annotation de toute variable locale déclaration auprès de la @Cleanup l'annotation de la sorte:

@Cleanup InputStream in = new FileInputStream("some/file");

En tant que résultat, à la fin de l'étendue que vous êtes en, in.close() est appelé. Cet appel est garanti par un essayer/pour finir de construire. Regardez le l'exemple ci-dessous pour voir comment cela fonctionne.

Si le type d'objet que vous souhaitez nettoyage ne pas avoir un close() la méthode, mais certains autres non-argument méthode, vous pouvez spécifier le nom de cette méthode comme suit:

@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);

Par défaut, la méthode de nettoyage est présumé être close(). Une méthode de nettoyage qui prend l'argument ne peut pas être appelé via le @Cleanup.

Vanille 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);
    }
  }
}

1voto

krock Points 13537

Les blocs ARM du projet Coin seront en Java 7. Cette fonctionnalité est destinée à apporter une fonctionnalité similaire à Java comme la syntaxe de .Net.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X