J'ai vu des références dans certaines questions postées par C# à une clause "using". Est-ce que java a l'équivalent?Est-ce que java a un équivalent à la clause C# "using"
Répondre
Oui. Java 1.7 a introduit la construction try-with-resources vous permettant d'écrire:
try(InputStream is1 = new FileInputStream("/tmp/foo");
InputStream is2 = new FileInputStream("/tmp/bar")) {
/* do stuff with is1 and is2 */
}
... comme une déclaration using
.
Malheureusement, avant Java 1.7, les programmeurs Java étaient obligés d'utiliser try {...} enfin {...}. En Java 1.6:
InputStream is1 = new FileInputStream("/tmp/foo");
try{
InputStream is2 = new FileInputStream("/tmp/bar");
try{
/* do stuff with is1 and is 2 */
} finally {
is2.close();
}
} finally {
is1.close();
}
Est-il possible de mettre à jour cette réponse avec un exemple de C# avec son bloc using, puis Java avec un try-finally? De préférence un exemple qui utilise deux ressources distinctes afin que nous puissions documenter comment nous assurer que tout est fermé correctement. –
En tant que gars Java, la comparaison ci-dessus est juste un peu douloureux. –
Bien que techniquement correct, ce modèle try/finally n'est pas le meilleur. Utilisez: X x = new X(); essayez {/ * work * /} enfin {x.disposer(); } – McDowell
Pas que je sache. Vous pouvez simuler un peu avec un try ... finally block, mais ce n'est toujours pas pareil.
Non, il n'y a pas d'utilisation en Java, la fonctionnalité la plus similaire est le mot clé "import".
L'affiche originale ne faisait pas référence à comprend. Voir http://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspx – McDowell
Mauvais @shifoz! Vous êtes cruels. La question était totalement vague et il aurait pu vouloir dire ceci: http://msdn.microsoft.com/en-us/library/sf0df423 (VS.80) .aspx ... Shifoz, vous pouvez récupérer quelques points en posant des questions sur les programmeurs aiment "quelle est votre couleur de programmation de favori en RVB?" –
Non, il n'y en a pas.
Vous pouvez
public void func(){
{
ArrayList l = new ArrayList();
}
System.out.println("Hello");
}
Cela vous donne la portée limitée de la clause à l'aide, mais il n'y a pas d'interface IDisposable pour appeler le code de finalisation. Vous pouvez utiliser try {} catch() {} Finally {}, mais il n'a pas le sucre d'utiliser. Incidemment, l'utilisation de finaliseurs en Java est généralement une mauvaise idée.
Je pense que vous pouvez réaliser quelque chose de similaire au bloc "using", en implémentant une classe interne anonyme. Comme le fait le printemps avec les "modèles Dao".
Le plus proche que vous pouvez obtenir en Java est try/finally. En outre, Java ne fournit pas de type jetable implicite.
C#: la portée de la variable en dehors d'un aide de bloc
public class X : System.IDisposable {
public void Dispose() {
System.Console.WriteLine("dispose");
}
private static void Demo() {
X x = new X();
using(x) {
int i = 1;
i = i/0;
}
}
public static void Main(System.String[] args) {
try {
Demo();
} catch (System.DivideByZeroException) {}
}
}
Java: la portée de la variable en dehors d'un bloc
public class X {
public void dispose() {
System.out.println("dispose");
}
private static void demo() {
X x = new X();
try {
int i = 1/0;
} finally {
x.dispose();
}
}
public static void main(String[] args) {
try {
demo();
} catch(ArithmeticException e) {}
}
}
C#: la portée de la variable dans un bloc
public class X : System.IDisposable {
public void Dispose() {
System.Console.WriteLine("dispose");
}
private static void Demo() {
using(X x = new X()) {
int i = 1;
i = i/0;
}
}
public static void Main(System.String[] args) {
try {
Demo();
} catch (System.DivideByZeroException) {}
}
}
Java: la portée de la variable dans un bloc
public class X {
public void dispose() {
System.out.println("dispose");
}
private static void demo() {
{
X x = new X();
try {
int i = 1/0;
} finally {
x.dispose();
}
}
}
public static void main(String[] args) {
try {
demo();
} catch(ArithmeticException e) {}
}
}
Eh bien, en utilisant du sucre syntaxique était de toute façon si Java semblables, ne transpirent pas.
L'équivalent le plus proche dans la langue est d'utiliser try-finally.
using (InputStream in as FileInputStream("myfile")) {
... use in ...
}
devient
final InputStream in = FileInputStream("myfile");
try {
... use in ...
} finally {
in.close();
}
Notez la forme générale est toujours:
acquire;
try {
use;
} finally {
release;
}
Si l'acquisition est dans le bloc d'essai, vous publierons dans le cas où l'acquisition échoue. Dans certains cas, vous pourriez être en mesure de pirater avec du code inutile (typiquement tester null dans l'exemple ci-dessus), mais dans le cas de, disons, ReentrantLock mauvaises choses vont se passer.
Si vous faites souvent la même chose, vous pouvez utiliser l'idiome "execute around". Malheureusement, la syntaxe de Java est verbeuse, donc il y a beaucoup de plaque de Bolier.
fileInput("myfile", new FileInput<Void>() {
public Void read(InputStream in) throws IOException {
... use in ...
return null;
}
});
où
public static <T> T fileInput(FileInput<T> handler) throws IOException {
final InputStream in = FileInputStream("myfile");
try {
handler.read(in);
} finally {
in.close();
}
}
exemple plus compliqué mon, par exemple, enveloppez exceptions.
Si nous obtenons des fermetures BGGA en Java, cela ouvrirait aussi des structures similaires en Java. Gafter a utilisé cet exemple dans ses diapositives, par exemple:
withLock(lock) { //closure }
L'idiome réel utilisé par la plupart des programmeurs pour le premier exemple est la suivante:
InputStream is1 = null;
InputStream is2 = null;
try{
is1 = new FileInputStream("/tmp/bar");
is2 = new FileInputStream("/tmp/foo");
/* do stuff with is1 and is 2 */
} finally {
if (is1 != null) {
is1.close();
}
if (is2 != null) {
is2.close();
}
}
Il y a moins indentation en utilisant cet idiome, qui devient encore plus important lorsque vous avez plus de 2 ressources à nettoyer.
De plus, vous pouvez ajouter une clause catch à la structure qui va traiter les nouvelles FileStream() en lançant une exception si vous en avez besoin. Dans le premier exemple, vous devriez avoir un autre bloc essay/catch si vous vouliez le faire.
Ce code ne ferme pas is2 si l'appel à is1.close() renvoie une exception. Le code imbriqué donné dans la question est préférable. – cunkel
Il a fallu attendre longtemps, mais avec Java 7, le try-with-resources statement a été ajouté, ainsi que l'interface AutoCloseable.
Oui, depuis Java 7, vous pouvez réécrire:
InputStream is1 = new FileInputStream("/tmp/foo");
try{
InputStream is2 = new FileInputStream("/tmp/bar");
try{
/* do stuff with is1 and is2 */
} finally {
is2.close();
}
} finally {
is1.close();
}
Comme
try(InputStream is1 = new FileInputStream("/tmp/foo");
InputStream is2 = new FileInputStream("/tmp/bar")) {
/* do stuff with is1 and is2 */
}
Les objets transmis en tant que paramètres à l'instruction try devrait mettre en œuvre java.lang.AutoCloseable
.Have un regard sur le official docs.
Pour les versions plus anciennes de Java, passez la commande this answer et this answer.
- 1. Schéma équivalent à Haskell où la clause
- 2. SQL équivalent à "using" pour les schémas?
- 3. Est-ce que 'using namespace' est dans un autre espace de noms équivalent à un alias?
- 4. C# Java HashMap équivalent
- 5. est-ce que cdb/windbg a un équivalent à autoexp.dat?
- 6. Est-ce que Python a un équivalent à 'switch'?
- 7. C# équivalent à DigestUtils.md5Hex de Java (chaîne)?
- 8. Java équivalent à
- 9. Est-ce que VB6 a un équivalent de #pragma pack?
- 10. C++ équivalent de Java ByteBuffer?
- 11. Existe-t-il un équivalent C# à File.separator en Java?
- 12. Est-ce que C# a un équivalent à encodeURIComponent() de JavaScript?
- 13. Java équivalent à WPF
- 14. Java Map équivalent en C#
- 15. Java équivalent à pyftpdlib?
- 16. Est-ce que ArrayObject de PHP a un équivalent in_array?
- 17. Génériques dans Boo - Existe-t-il un équivalent de la clause C# où
- 18. Équivalent Objective-C de BlockingQueue de Java?
- 19. équivalent Java de C# 's Rfc2898DerivedBytes
- 20. C# a-t-il un équivalent de classe imbriquée statique Java?
- 21. La clause fast fast finally dans Java
- 22. Java équivalent à .NET System.Net.ServicePointManager
- 23. C# C équivalent à l'union
- 24. C# équivalent de Java par exemple initialiseur
- 25. C# équivalent du mot-clé Java 'implémente'?
- 26. 'Amis' équivalent pour Java?
- 27. Quel est le C# équivalent à isInstance() de Java?
- 28. STXXL équivalent en Java
- 29. Équivalent DataTable en Java
- 30. Est-ce que java a des attributs comme C#?
avec java 7 la réponse est passée de non à oui –