30
juillet
2005
SCJP 5.0 Défi 5.1: public static final
juillet
2005
Un article de vbrabant
11 Commentaires
Pour vous préparer à la Certification Java SCJP 5.0, nous vous proposons quelques défis.
Aujourd’hui, en voici un nouveau concernant les membres déclarés public static final
Dans la classe System, le membre out est déclaré comme étant public static final.
Pourtant, il existe une méthode setOut() qui permet d’en changer la référence.
Comment expliquez-vous cela ?
11 Commentaires + Ajouter un commentaire
Commentaires récents
Archives
- janvier 2012
- novembre 2010
- février 2009
- janvier 2009
- décembre 2008
- septembre 2008
- août 2008
- décembre 2007
- octobre 2007
- septembre 2007
- juillet 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
- décembre 2006
- novembre 2006
- octobre 2006
- septembre 2006
- août 2006
- juillet 2006
- juin 2006
- mai 2006
- avril 2006
- février 2006
- janvier 2006
- décembre 2005
- novembre 2005
- octobre 2005
- septembre 2005
- août 2005
- juillet 2005
- juin 2005
- mai 2005
- avril 2005
Catégories
- Certification
- Défis
- Devoxx
- Devoxx 2008
- Devoxx 2010
- Devoxx France 2012
- Divers
- Événements Java
- Fiches
- Hardware
- In English
- Java
- JavaDay 2006
- JavaFX
- JavaOne 2005
- JavaOne 2006
- JavaOne 2007
- Javapolis 2005
- Javapolis 2006
- Javapolis 2007
- JBoss
- Livres
- Mac
- NetBeans
- OpenJDK
- Pensée
- Performance
- Perles
- Sun Tech Days Paris 2007
- Traduction
j’aurais tendance a etre d’accord avec cortex93.
Mais si c’est vrai alors la facon d’encoder les caracteres lors de l’appel aux print definis dans le nouveau PrintStream ne sont pas utilise. Et donc il aurait ete plus judicieux de mettre une methode setOut(OutputStream os).
De plus on pourrai imaginer recuperer l’encodage du nouveau PrintStream et changer l’encodage du out mais il n’y a pas de fonction pour ça.
Une reponse ?
je pense plutot qu’il y a deux sorties, une standard System.out et une autre qui est à null par défaut.
le setOut permettrait donc d’affecter la deuxième sortie, et lors d’une opération d’écriture, par exemple println(), on test la deuxième sortie, si elle est à null, alors on écrit sur la sortie standard sinon on écrit sur la deuxieme
Je pense que la méthode setOut() change tout simplement le membre protégé hérité de FilterOutputStream qui lui n’est pas final.
Je dirais que lorsque que l’on fait setOut(), on change un attribut de System ce qui dans un premier temps n’influe pas sur out lui même. Puis lorsque par exemple, on fait un System.out.println(« »); la méthode println appelle un méthode de System qui lui envoit la nouvelle référence instancié au dessus.
la méthode setOut est en effet implémentée de façon native, mais la réponse n’est pas à chercher de ce coté là.
Allez, je vous laisse encore un peu chercher.
Mmmhh… Peut-être que le System.out « écrit » dans un autre flux (PrintStream private), et c’est en fait celui-là que l’on modifie en appelant System.setOut()… Non?
C’est exactement ça, c’est le code natif qui modifie directement la référence.
Celui qui a écrit cette classe aurait du utiliser la technique du singleton ça aurait été plus propre en effet. Mais dans ce cas on serais obligé de tapper quelque chose comme : System.getOut().println(« Salut ! »); pour écrire sur le flux.
JHelp
Je confirme. Je ne sais plus ou j’ai lu cela mais je sais que le final utilisé dans System est contourné par du code natif. Le mot clef final ne garantissant la non-redefinition que au niveau Java…
oups autant pour moi j’ai répondu un peu trop vite… il me semblait qu’on pouvait également modifier System.out avec une simple affectation mais j’ai du confondre…
Je pense qu’il doit y avoir du code natif derrière tout ca pour pouvoir le modifier… mais c’est pas très propre je trouve…
En tout cas j’attend ton explication
a++
Pourtant, System.out est bien déclaré en final.
cfr http://javasearch.developpez.com/j2se/1.4.2/docs/api/java/lang/System.html#out
Et logiquement, ce qui est déclaré et initialisé avec public static final ne peut être modifié.
D’où la question. Comment se fait-il qu’on puisse modifier la référence de System.out alors qu’elle est déclarée public static final ?
Salut,
Il me semble que la méthode setOut() permet de changer le flux de sortie standard (stdout) de l’application, en plus de modifier la référence de System.out…
Par contre System.out n’est pas déclaré en final sinon sa référence ne pourrait pas être modifiée…
a++