10
votes

Simulation de Python avec la déclaration en Java

Y a-t-il quelque chose comme Python avec Gestionnaire de contexte en Java?

Par exemple, disons que je veux faire quelque chose comme ce qui suit: xxx

Où dans Python, j'ai juste: xxx


2 commentaires

Je ne connais pas grand chose à propos de avec ou python, mais si c'est quelque chose comme ça comme c # 's en utilisant Ceci a été répondu très récemment: Stackoverflow.com/Questtions/2943542/Utilisation-keword-in-java


+1 mais: [const] [final] existe également, donc [with] devrait également avoir une étiquette. Je ne peux pas encore le créer.


5 Réponses :


7
votes

Pas pour le moment; Java n'a toujours pas ajouté de sucre syntaxique pour ce motif. Néanmoins, il ne sera pas aussi propre que avec code> (python) ou en utilisant code> (C #), mais vous pouvez au moins nettoyer cela un peu en ayant juste un appel à c.cfin () code> à l'intérieur d'un bloc enfin code>, au lieu de deux fois que vous avez fait:

try {
    // use c
} finally {
    c.close()
}


1 commentaires

Merci ... Je pouvais également utiliser un modèle de méthode de modèle qui nécessite une hiérarchie de classe laid. À votre santé.



3
votes

Comme dit Tzaman, le secret utilise enfin; Généralement:

doWithResources(new WithResources() {
    public void doStuff(Resource1 r1, Resource2 r2) {
        // code goes here
    }
});
  • essayez enfin chacun de créer une portée variable. Ainsi, l'allocation de votre ressource au sein de la clause TRY ne fonctionnera pas, car elle ne sera pas visible dans la clause enfin - vous devez déclarer la variable de la ressource avant la déclaration d'essai. LI> ul>

    Si vous avez plusieurs ressources pour allouer, le motif général s'applique proprement, mais cela n'est souvent pas évident pour les débutants: p> xxx pré>

    , et ainsi de suite et ainsi de suite. ainsi de suite si vous avez plus de ressources pour allouer. Si vous avez quelques-uns d'entre eux, vous serez sûrement tenté d'essayer d'éviter de nichier profond d'essayer ... Enfin des déclarations. Ne pas. Vous pouvez obtenir des ressources de ressource et une manipulation des exceptions à droite sans niché de nidifier si beaucoup d'essayer ... Enfin, les déclarations, mais le get droite sans nidifier, essayez ... Enfin, est encore plus la plus en plus la plus enduite que la nidification profonde. P>

    Si vous avez fréquemment besoin de Utilisez un ensemble de ressources, vous pouvez implémenter une méthode basée sur le foncteur pour éviter la répétition, comme: p> xxx pré>

    qui puisse utiliser comme ceci: p> XXX PRE>

    DowithResources gérera automatiquement l'attribution et la répartition correctement, et votre code aura moins de répétition (ce qui est une bonne chose). Toutefois: p>


3 commentaires

Merci, la chose du fonceur a l'air intéressant. De mauvais, il n'y a pas de sucre pour le simplifier.


Aussi - ne voulez-vous pas dire près () au lieu de disposer ()? Java a une interface closeable.


"Dispose" vient de sonner plus générique :-p. C'est juste pseudocode :-p



2
votes

Il y a une alternative utilisant une enveloppe générique comme celle-ci: xxx pré>

Remarque: la voie Java est celle que vous venez de décrire. Cet autre est juste pour "amusement" et expérimentation: p>

Le _ code> est un wrapper générique et le avec la fonction code> est une classe d'utilitaire définie ailleurs comme : P>

    public void update( final int itemId, String newName ) {
        final _<Connection> c = new _<Connection>();
        with( factory, c, new Runnable() {
            public void run(){
               Item item  = c._.query( itemId );
               item.setName( newName );
               c._.update( item );
            }
        });
    }


4 commentaires

Qu'est-ce que les traits de soulignement manifestent partout? Noms de variables temporaires?


Ce n'est pas Java (la langue) mais je l'enveloppe de classe générique que j'ai créée. Vous pouvez penser à cela comme un Pass Pass par référence Substitut. Il est défini comme suit: classe _ {public e _; } : p


Désolé, je ne suis toujours pas sûr de ce que sont des traits de soulignement. Vous dites qu'ils ne font pas partie de la langue Java ???


@Drozzy: Non dans le sens int ou pour sont. Le soulignement n'est qu'un autre nom de classe et un autre nom de champ. Je viens d'l'utiliser parce que le code a l'air plus propre. Voici une comparaison: avec un nom régulier: Pastebin.com/rqpttnpk à l'aide de Uderscore: Pastebin.com/tzur8b5c Diff: Pastebin. com / cjhr1gwe



29
votes

Java 7 a introduit une nouvelle fonctionnalité pour résoudre ce problème: "Essayez avec les ressources"

http://docs.oracle.com/javas.oracle.com/javase/tutorial/essential/exceptions/tryresourceclose.html

FERMER LES RESSOURCES DIFFICILLENT UTILISER ESSAYER AVEC DES RESSOURCES

La syntaxe consiste à placer la ressource entre parenthèses après Le mot clé essaie: xxx

avant JAVA 7, vous pouvez utiliser un bloc enfin. xxx


0 commentaires

2
votes

Essayez avec les ressources a été introduite dans Java 7. Avant que vous ayez dû utiliser des blocs TRY-enfin. Voir la documentation ici: https://docs.oracle.com/javase/tatutoriel /essential/Exceptions/ecteurResourceclose.html


0 commentaires