7
votes

Sur system.out, clarification nécessaire

Je cherchais le code de quelqu'un et j'ai vu qu'il a déclaré à plusieurs reprises

out.println("blah");


4 commentaires

Il aurait pu aussi facilement ajouter un importer statique java.lang.system.out; déclaration en haut du fichier.


@Ilmtitan C'est une solution de tendition uniforme, mais bien sûr, ne travaillera que avec Java 5 et plus.


@Alb Java 5 a déjà terminé sa période de fin de vie.


@Tom Fair assez, mais je dois toujours soutenir un code Java 1.4, donc je n'ai vu aucun préjudice dans l'ajout de la mise en garde


9 Réponses :


0
votes

C'est un raccourci si vous faites beaucoup de println. Je l'ai vu fait dans des endroits précédents, bien que j'ai tendance à ne pas le faire parce que je pense que system.out. println est plus clair puisque vous n'avez pas besoin de déterminer où out a été attribué. Je configurais un modèle Eclipse afin que je puisse autocomplete println à system.out.println et c'est assez rapide.


2 commentaires

Eclipse a un modèle intégré "Sysout", de sorte que vous n'aviez même pas besoin de créer votre propre :)


Vrai, mais j'écris beaucoup de code Groovy et de cette façon, je peux utiliser PrintLn dans l'une ou l'autre langue.



0
votes

Nope. Jamais vu ça avant.

Je suis d'accord. Ce n'est pas trop shabby ...


0 commentaires

7
votes

C'est une approche raisonnable. Il crée essentiellement un alias pour system.out . Il y a un certain nombre d'avantages:

  • moins de dactylographie.
  • plus facile à modifier ultérieurement le code en sortie sur une autre pimentation.
  • éventuellement une amélioration de la performance, bien qu'elle soit négligeable.

3 commentaires

Point 1, pas moins que Sysout qui insérera "System.Out.println ()". Point 2, oui, mais cela signifie également que vous pouvez faire l'erreur de supposer que "Out" signifie System.Out.println parce que c'est ainsi que cela a été fait partout ailleurs dans le code. Il est également plus explicite, comme n'utilisant pas de noms de variables courts. Point 3 - Non. La compilée est plus intelligente que vous. Ne prenez jamais une décision basée sur ce que vous pensez que le compilateur va faire sans le baser sur des tests - votre devinette est presque toujours fausse, le compilateur optimise en fonction de vous ne pas être délicat - en écrivant le code le plus clair possible.


@Bill K: Le compilateur est intelligent, mais la sémantique de l'accès sur le terrain vs accès variables local est différent, il ne peut donc pas l'optimiser en général. Qui a pour dire println () n'a pas changé la valeur de systeme.out? (Les champs finaux ne sont pas aussi finaux que vous le pensez - regardez System.setout ().)


@Adam Crume Je suppose que j'aurais dû dire que le compilateur + Runtime est plus intelligent que vous ne le pensez. Il peut examiner le fait que System.out ne change pas et en ligne le code pour y écrire. En fait, il peut aligner tout le bloc de code pour effectuer la production réelle si elle le souhaite - ce n'est probablement pas, mais je ne serais pas trop surpris si c'était le cas. Si vous étiez alias "Out", cela pourrait empêcher une telle optimisation d'exécution. Fondamentalement, tout ce que je disais, c'est que si vous effectuez une décision de programmation basée sur des avantages de performance théoriques au lieu d'avantages testés, vous devez vraiment repenser cela.



3
votes

Pour éviter taper system.out.println spécialement lors de l'exécution d'un petit test (sans IDE), j'utilise importer statique java.lang.system.out

Mais cela peut donner un sens si vous souhaitez remplacer la valeur de system.out ultérieurement, peut-être à une enveloppe pour rediriger vers un fichier xxx

et Silence la sortie standard à la fois. Je le répète mai a un sens sur certains scénarios, car pour cela, j'utiliserais un cadre de journalisation.

BTW, il serait préférable de le déclarer comme final et statique également: xxx


0 commentaires

0
votes

Si vous regardez à Jetonable.PrintStackTrace dans la documentation, vous pouvez l'appeler sans argument, et cela passe simplement System.out à la version qui prend une copropriété.

Il est assez courant de trouver des situations dans lesquelles un certain nombre d'objets de PrintStream différents pourraient être transmis et permettent d'imprimer un code d'impression beaucoup plus simple.


0 commentaires

0
votes

C'est un tour mignon, mais comme la plupart des astuces mignonnes, il pourrait être préférable de le faire correctement.

Une fois que vous êtes arrivé au point où vous êtes sûr de vouloir vous connecter (assez sûr d'ajouter quelque chose comme ça), pourquoi pas seulement obtenir log4j ou un autre système de journalisation qui a encore plus de flexibilité et de puissance?

Aliasing Stuff est un peu mignon et amusant si vous êtes seul, mais même si vous êtes un typiste vraiment lent et que cela vous permet d'économiser 5 secondes entier chaque fois que vous le tapez (sur systeme.out ou "sysout + " dans Eclipse / Netbeans), vous perdrez ce temps dix fois la première fois que quelqu'un- -Possiblement vous - voit "Out". et ne sait pas immédiatement ce que cela signifie.

Je veux dire, dans un programme disons que vous avez fait quelle autre affiche a suggéré et redirigé "Out" pour aller dans un fichier au lieu de stdout mais dans certaines classes mais dans certaines classes , peut-être que "sortir" va toujours à System.out. Ou peut-être que vous oubliez simplement que vous l'avez redirigé dans un fichier. Plus tard, vous entrez et dites "Eh bien, il dit: xxx

mais je ne vois pas cette ligne dans stdout, qu'est-ce que diable?"

Ensuite, vous passez 4 heures à suivre une mauvaise indication au lieu de résoudre le bogue.


4 commentaires

Si vous utilisiez Eclipse et que vous avez vu «OUT», n'appuyez-vous pas simplement sur F3 dessus et voyez exactement où cela allait sans temps perdu? Je suis tout pour éliminer la duplication et supprimer le système. Appelez tous les cas où il est utilisé est d'éliminer la duplication. Les raisons sont bien décrites par la réponse Stackoverflow .com / questions / 3041482 / ...


Pas si vous n'avez pas pensé, ce qui est tout le point. Beats explicites brèves lorsque vous travaillez avec d'autres. Lorsque vous êtes seul, votre code peut être aussi amusant que vous le souhaitez, mais je suis vraiment fatigué de travailler sur des astuces mignonnes d'autres peuples. Cette attitude obtient de l'amour / la haine avec les conventions de nommage variable Java. Je veux dire, vous économiserez autant d'espace en utilisant YALVN au lieu de tatanotherlongvariablename, mais certaines personnes commencent à obtenir l'importance d'explicitement bref (au moins dans le monde Java - je vois toujours beaucoup de variable "YALVN" C noms, comme s'ils ont pris la mémoire ou quelque chose)


Bien sûr, j'apprécie un nom de méthode décent, mais dans ce cas, le nom de la méthode d'origine est juste "sorti". Tout d'abord, je ne pense pas que quiconque devrait supposer que ce serait system.out sans le vérifier, d'autre part, je ne pense pas ajouter le paquet à chaque invocation est le meilleur moyen de gérer cependant. Extrayer tous les systèmes System.out Les appels vers A, par exemple, la méthode «PrintToconsole» ou «PrintTologStream» est meilleure que de les laisser en ligne à mon avis car elle supprime la duplication, mais conserve la clarté de l'intention.


@ Alb - Cela ne supprime pas vraiment la duplication - ça me bugs quand les gens ne l'obtiennent pas. Dans la programmation, la duplication importante à regarder n'est pas dupliquer la dactylographie ou le code explicite, sa logique en double (qui vous oblige à apporter des modifications dans plusieurs emplacements pour résoudre un problème). Bien que cela permet de changer votre destination forestière au même endroit - je pense toujours que si vous allez aller jusqu'à alori, pourquoi n'utiliseriez-vous pas un véritable emballage de l'enregistreur?



0
votes

Que ce soit une bonne idée est discutable et dépend probablement des circonstances.

sur le côté plus:

  • Cela rend le code de la demande d'apparence Natre.
  • Il peut simplifier la modification de la destination pour la sortie.

    sur le côté moins:

    • Il augmente potentiellement l'accouplement croisé; par exemple. Si la variable est une variable d'instance ou doit être transmise en tant que paramètre.
    • Il provoque potentiellement des problèmes si votre application doit appeler system.setout () .
    • Si le code System.out est simplement le débogage, cela rend plus difficile de remarquer et de supprimer. En effet, il annule probablement des contrôles de qualité du code PMD (etc.) qui signalent ce genre de chose.

      Il convient de noter qu'il existe potentiellement d'autres moyens de le faire; par exemple. Remplacement de system.out.println (chaîne) avec une méthode utilitaire printline (chaîne) atteint un effet similaire sans couplage croisé.


0 commentaires

0
votes

Etant donné que system.out est une variable finale , ce qu'il a fait serait Identifical pour référencer system.out directement.

sauf si quelqu'un appelé system.setout () qui a été réaffecté system.out .

attendre, quoi?


0 commentaires

1
votes

Ce pourrait être car en général, il n'est pas recommandé de plonger et d'utiliser des objets membres d'autres objets. On voit comme une personne qui a atteint votre poche pour obtenir votre argent de votre portefeuille au lieu de vous demander de lui prêter de l'argent.

Il pourrait y avoir un léger avantage pour cela, ce qui serait capable de changer le flux de sortie si nécessaire dans un fichier, une prise ou autre chose. Donc, il serait capable de remplacer: xxx

avec xxx

Toutefois, s'il le déclare à plusieurs reprises encore et encore Il perd vraiment l'avantage ci-dessus, car tout le point serait de l'avoir quelque part centralisé et décider où produire les journaux en un seul endroit.

Notez qu'il s'agit d'une manière très brute et de la pratique standard réelle est d'utiliser la journalisation. Java a son propre package Java.Utillogging hors de la boîte, log4J est une autre alternative très puissante (et très populaire) et il y en a d'autres.


0 commentaires