Bonjour,
Ce débat est destiné à parler des nouveautés du JDK 7 (pas seulement le projet Coin).
Qu'en pensez-vous ?
Qu'auriez-vous aimé d'autre dans cette nouvelle version de Java ?
Qu'aimeriez-vous voir dans les futures version de Java ?
Bonjour,
Ce débat est destiné à parler des nouveautés du JDK 7 (pas seulement le projet Coin).
Qu'en pensez-vous ?
Qu'auriez-vous aimé d'autre dans cette nouvelle version de Java ?
Qu'aimeriez-vous voir dans les futures version de Java ?
L'invocation dynamique c'est le seul truc que je retiendrai. Pour le reste, une bonne completion / indentation fait l'affaire.
Par contre j'aurai aimé qu'ils se penchent sur des points importants :
-accélérer les fonctions trigos qui sont 10 fois plus lentes qu'en C (donc toujours pas de code de calcul en java : vive la fft et le traitement de signal)
-a quand un delete possible (comme pour flash), on pourrai enfin avoir un code java reproductible en temps ?
-intégrer jogl en standard et porter swing en jogl. Sun s'offrirerai enfin le luxe de couper l'herbe sous le pied à Adobe à propos de la 3D native (qu'ils sont visiblement pas près d'avoir).
-accélérer le temps de chargement des applets javafx pour faire enfin décoller ce petit bijoux.
-pourquoi une méthode/champs protected est toujours en visibilité pacquet ?
-pouvoir déclarer les InnerClass dans un .java pour plus de lisibilité (ceux qui vont souvent dans le code de la JVM me comprendront).
-pouvoir compiler une chaîne de caractère autrement que ""+""+"". Impec pour des requêtes SQL, l'écriture XML ou d'un code assembleur/C pour un shader.
-a qd un preprocesseur en standard javac ?
Des moins importants :
-corriger l'implémentation douteuse des JDialog et les weakreference de leurs enfants (ça c très merdique et très décevant de la part de Sun).
-configuration automatique possible du garbage collector (xmx dépend de la machine cible)
-possibilité de renommer java.exe et de le sortir de java/bin (impec pour le déploiement et le kill d'une appli java)
-Pouvoir ajouter des listeners en réponse au kill pour libérer des ressources par ex.
-Il était question d'extraire le window manager de netbean et de le mettre en std !
Et un truc qui serai franchement top :
- Avoir des exceptions qui ne puissent être rattrapées que par certaine classe.
(par ex le OutOfMemory ne devrait pas être rattrapable par n'importe qui).
- Pouvoir faire un pull de mémoire configurable par classloader.
Avec ces deux trucs (et le SécurityManager) , une appli à plugin pourrait gérer complètement les défaillances de ses petits.
Si tu change ça, tu pete toutes les applications existantes qui supposent qu'un champ protected doit etre accessible aussi depuis le paquet. On pourrait ajouter un nouveau mot clé, mais chez sun ils aiment pas ajouter de nouveaux mots clés. Puis comme on l'a dit, ca changerais le bytecode et c'était visiblement pas le but
Tu veux dire la sortir de sa parent class pour la stocker dans un .java indépendant?-pouvoir déclarer les InnerClass dans un .java pour plus de lisibilité (ceux qui vont souvent dans le code de la JVM me comprendront).
Au choix tu a stringbuilder, stringbuffer, stringformat-pouvoir compiler une chaîne de caractère autrement que ""+""+"". Impec pour des requêtes SQL, l'écriture XML ou d'un code assembleur/C pour un shader.
Il me semble que, sous unix, par exemple, il est impossible de renommer une application une fois lancée, que ce soit en java ou autre-possibilité de renommer java.exe et de le sortir de java/bin (impec pour le déploiement et le kill d'une appli java)
Voir la doc sur les shutdownHooks. Pour les autres signaux (sous unix par exemple), il faut passer par des apis natives spécifique car la notion de signaux n'existe pas sur tout les OS-Pouvoir ajouter des listeners en réponse au kill pour libérer des ressources par ex.
Je peux comprendre que ca permet de contourner le problème des zozos qui font du catch(Throwable), mais le problème de base là, c'est le mauvais codage dans l'appli en question, pas le role du copilateur de tourner autour de ces erreurs. De plus on peux envisager des cas ou ce catch est légitime (bien que limite). Tu lancer un calcul gourmand mais rapide, tu catch le OutOfMemory et en cas de déclenchement tu calcul autrement avec moins de mémoire.- Avoir des exceptions qui ne puissent être rattrapées que par certaine classe.
(par ex le OutOfMemory ne devrait pas être rattrapable par n'importe qui).
Je vois bien l'idée mais ca poserais en pratique d'énorme soucis en raison du principe de délagation des classloader (va-t-en savoir qui doit être le propriétaire de la String machin qu'on viens de créer). A la rigeur une zone mémoire par threadgroup ce serait peut être gérable (et encore)- Pouvoir faire un pull de mémoire configurable par classloader.
Cet article ne couvre que le projet Coin. Tout ceci ne correspond pas a des évolution du langage même mais a des évolutions de la JVM ou de ses API, ce qui ne concerne pas le projet Coin.
Pour ce qui est du listener en réponse au kill, ca existe déjà.
Tu voudrais un delete à la C++ qui détruirait immédiatement l'objet sans passer par le garbage collector?-a quand un delete possible (comme pour flash), on pourrai enfin avoir un code java reproductible en temps ?
L'idée peu paraitre intéressante pour certain cas particulier. Mais pour le coup ca deviens dangereux car sa casserait un principe fondamental en java : toute référence a un objet est toujours valide.
L'impact de ce genre de chose me parait énorme et ca pourrait potentiellement entrainer beaucoup de problèmes.
Parceque je ne crois pas que ca pose de problèmes à grand monde. De plus changer ça, changerait les base même du langage et causerait des problèmes de compatibilité inutiles-pourquoi une méthode/champs protected est toujours en visibilité pacquet ?
Je n'avais jamais songé a ça mais c'est vrai que ça pourrait être intéressant.-pouvoir déclarer les InnerClass dans un .java pour plus de lisibilité (ceux qui vont souvent dans le code de la JVM me comprendront).
La je ne comprends pas vraiment ce que tu souhaites.-pouvoir compiler une chaîne de caractère autrement que ""+""+"". Impec pour des requêtes SQL, l'écriture XML ou d'un code assembleur/C pour un shader.
Jamais je l'espère. Java s'en passe très bien pour le moment et si tu en a besoin pour un usage très particulier, rien ne t'empêches d'en utiliser un.-a qd un preprocesseur en standard javac ?
Par curiosité, pour quel genre de chose aurait tu besoin de ça.
J'suis qd même currieux de savoir pour quelle raison ils ont fait ce choix.Si tu change ça, tu pete toutes les applications existantes qui supposent qu'un champ protected doit etre accessible aussi depuis le paquet. On pourrait ajouter un nouveau mot clé, mais chez sun ils aiment pas ajouter de nouveaux mots clés . Puis comme on l'a dit, ca changerais le bytecode et c'était visiblement pas le but
C vrai que l'incompatibilité serait génante.
OuiTu veux dire la sortir de sa parent class pour la stocker dans un .java indépendant?
En fait j'pensais à un truc du type as3Au choix tu a stringbuilder, stringbuffer, stringformat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 var monXML:XML = new XML (); monXML = <balise><test/></balise>;
mais plus générique du type
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 StringBuilder ou String s={mon texte de n'importe quoi encodé dans l'encodage du source java qui prend donc pas trop de place mais qui est très pratique pour faire des requête au xml ou ... maintenable}Malheureusement pour l'humanité il existe autre chose qu'UNIX.Il me semble que, sous unix, par exemple, il est impossible de renommer une application une fois lancée, que ce soit en java ou autre
Et puis je pense que ça peut poser des problèmes avec jconsole (mais la je m'avance).
C qd même pas la mort de permettre ça. Ils en ont bien conscience car la majorité des IDE font un lanceur home made.
ya ca c du bonshutdownHooks
Très souvent dans le coeur d'une appli à plugin il est indispensable de faire un catch(Throwable).Je peux comprendre que ca permet de contourner le problème des zozos qui font du catch(Throwable), mais le problème de base là, c'est le mauvais codage dans l'appli en question, pas le role du copilateur de tourner autour de ces erreurs. De plus on peux envisager des cas ou ce catch est légitime (bien que limite). Tu lancer un calcul gourmand mais rapide, tu catch le OutOfMemory et en cas de déclenchement tu calcul autrement avec moins de mémoire.
Par ex :
Un plugin déclare une vue (une JTable par ex). Après passage d'un algo, le coeur de l'appli gère les mises à jours. Et là le plugin se viande et une belle NullPointer revient dans le coeur. Là il est indispensable de faire un truc du genre :
Si on veut protéger un minimum l'appli.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 for(View view:Views) { try { view.update(); } catch(Throwable t) { //on fait un truc en conséquence } }
Si le security manager pouvait aussi gérer les catch ...
Un peu comme APR (Apache). Mais passer par les ClassLoader c'est ambigue.Je vois bien l'idée mais ca poserais en pratique d'énorme soucis en raison du principe de délagation des classloader (va-t-en savoir qui doit être le propriétaire de la String machin qu'on viens de créer). A la rigeur une zone mémoire par threadgroup ce serait peut être gérable (et encore)
Nouvel argument à new alors.
Oui. Effectivement ça casserait ce principe. Mais il me semble important de pouvoir indiquer au gc qu'un objet de nième génération est libérable (si il est d'accord sur ce point, il efface immédiatement l'object et ce de façon récursive sur le graphe objet) afin d'éviter que le gc ne se déclenche à un moment inattendu et généralement inopportun.Tu voudrais un delete à la C++ qui détruirait immédiatement l'objet sans passer par le garbage collector?
L'idée peu paraitre intéressante pour certain cas particulier. Mais pour le coup ca deviens dangereux car sa casserait un principe fondamental en java : toute référence a un objet est toujours valide.
L'impact de ce genre de chose me parait énorme et ca pourrait potentiellement entrainer beaucoup de problèmes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 delete obj; //serait équivalent à obj=null; System.gc(); //si System.gc() était déterministe //ici rien ne garanti que notre objet soit effacéJe pense comme toi que l'utilisation bourine du preprocessor est à bannir.Jamais je l'espère. Java s'en passe très bien pour le moment et si tu en a besoin pour un usage très particulier, rien ne t'empêches d'en utiliser un.
Par curiosité, pour quel genre de chose aurait tu besoin de ça.
Mais son utilisation intelligente est à benir.
C'est en regardant le source de GIMP (je crois que c gimp) que j'me suis souvenu du preprocessor et de sa puissance.
Bien souvent les IDE proposent de générer du code automatiquement, qu'il faut reprendre généralement. Une macro permet de faire la même chose en mieux.
Ca permet de façon très concise d'avoir un résultat équivalent qu'à du xml qui passe dans du xsl pour faire du java et un autre source java car le xml ne suffit jamais en soi.
Problème #1 : System.gc() est super lourd et doit être évité !
Problème #2 : ce n'est pas parce que tu mets une référence à null que l'objet correspondant peut être libéré.
Problème #3 : si tu veux un comportement déterministe il faut revoir complètement la gestion de la mémoire, afin qu'une référence que tu "supprimes" avec delete ne soit pas partagé... sinon on va se retrouver avec des références invalides ce qui est une abbération en Java
Tout cela pour pas grand chose en fait...
a++
Désolé, j'me suis mal exprimé.Problème #1 : System.gc() est super lourd et doit être évité !
Problème #2 : ce n'est pas parce que tu mets une référence à null que l'objet correspondant peut être libéré.
Problème #3 : si tu veux un comportement déterministe il faut revoir complètement la gestion de la mémoire, afin qu'une référence que tu "supprimes" avec delete ne soit pas partagé... sinon on va se retrouver avec des références invalides ce qui est une abbération en Java
Le "delete" n'est pas fait pour effacer l'objet sans vérif (je crois que c'est le cas dans flash).
En fait delete n'est pas approprié, il faudrait plutôt l'appeler gcOn(obj)
Le but est simplement de notifier au gc que l'objet en question ne devrait plus être référencé et si tel est le cas de l'effacer.
Cette opération ne serait pas effectuée si l'objet était référencé ailleurs.
Exemple :
Dans une application MDI j'effectue les opérations suivantes :
-Open project
-Do something costly
-Save & close project
Moi en interne je n'ai plus aucune référence sur le projet mais le gc ne s'est tjrs pas déclanché et le projet est à coup sûr encore en RAM. Même si il s déclanche ou que j'invoke le gc, comme mon projet est de nième génération, il ne sera pas libéré.
-New project (et là j'attends que le gc fasse son boulot car j'ai plus de mémoire)
si tu regarde la manière dont fonctionne le gc en interne, tu verra que on ne peux jamais supprimer 1 objet. On travaille toujours sur des calculs de l'ensemble des objet. Ton problème est un problème de performance, et un mot clé delet eest une fausse solution. Ce qu'il faut c'est simplement des GC plus performant. Sinon lors du delete, tu va parcourir toute la heap pour tester si 1 objet peut être libéré, alors qu'il faudrait au contraire libérer tout ce qui est libérable à ce moment là.
C surement pour ca que flash doit effacer l'objet sans vérifier le graphe objet.
J'ai eu pas mal de retour clients qui se plaignaient de ce comportement sur des applis gourmandes, et là malheureusement ya rien à faire.
tu peux lancer la jvm en mode server. Ceci utilise un algorithme de garbage collector qui réduit les blocage dus au GC.
De plus dans java 7 il y aura un nouvel algorithme de Garbage Collector nomé G1 qui devrait aussi permettre d'augmenter les perfs et de réduire les pauses.
Il est même déjà disponible dans les toutes dernières updates du JRE 6, en tant qu'option expérimentale et désactivée par défaut. Pour plus d'explication sur G1 :http://java.sun.com/javase/technolog...c/g1_intro.jsp
10 fois? Ca m'étonnerait. De plus, l'API ForkJoin ouvre la porte à l'utilisation des SIMD en Java (jetez un coup d'oeil à la classe ParallelArray par exemple) :
http://www.javac.info/jsr166z/jsr166...llelArray.html
Le coeur algorithmique de certaines applications professionnelles scientifiques utilise déjà Java, c'est ce qui me mène à penser que tu exagères.
Kenneth Russell ne veut pas qu'on fasse ça (pour que le JDK ne dépende pas d'une version particulière de JOGL entre autre) mais ça n'empêche pas que JavaFX utilise en douce JOGL. Swing bénéficie déjà de l'accélération graphique, il faudrait plutôt que le pipeline OpenGL existant soit fiabilisé car c'est pas encore ça sur certaines machines.
Le Java Kernel résoud déjà en partie ce problème dans Java 1.6, l'installeur Adobe fait 1.8 Mo et ce kernel fait environ 3 Mo.
Tu peux aussi fixer la durée des pauses en utilisant l'Incremental Low Pause Collector.
Vous pouvez forcer la finalisation et appeler le ramasse-miettes mais ça ne règlera pas le problème si c'est une fuite mémoire (pensez à Purify Plus ou à un profiler).
brainstorming (c.a.d. je me réserve le droit de dire des bétises)
souhaiter une plus grande facilité de modification du comportement du compilateur en fonction d'annotations.
exemple 1:
toutes les fois où on utilise ce champ warning si pas syntaxe spéciale pour tester si la référence est nulle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class Produit { @MightBeNull private String description ; }
en poussant le bouchon on pourrait transférer l'annotation à la méthode "getDescription" ... sauf qu'il est possible que ce test outrepasse les possibilités du compilateur ....(peut-on prouver qu'on peut vérifier que l'affectation du résultat de la méthode peut être aussi controlée partout?)
exemple 2:
On impose ici à l'argument une précondition ... le compilateur peut remonter la pile des invocations pour controler si le test est fait quelque part (un peu à la manière des Exceptions controlées)...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public void méthode(@PRECOND(TestPositif.class) Number arg) { .....
même remarque que précédement: nécessite des évolutions syntaxiques, pas évident que ce soit toujours faisable, chatouille un peu plus les annotations en leur faisant jouer un rôle proche de la sémantique du programme...
mais bon on peut toujours réver![]()
Ce n'est pas tellement un rêve : non seulement cela existe déjà mais il y a déjà des travaux là dessus via la JSR 305 !
- Des outils d'analyses comme FindBugs ou celui intégré dans l'EDI IntelliJ permettent déjà d'utiliser des annotations propriétaires pour définir ces informations, et permettre une meilleure détection des bugs.
Le problème c'est justement que ces annotations ne sont pas standard, donc peu utilisé... ce qui les rend peu utile !
- La JSR 305 (Annotations for Software Defect Detection) a justement pour objectif de définir un ensemble d'annotations standard qui pourrait être utilisé par ces outils, ce qui permettra de les utiliser massivement et donc d'améliorer leurs résultats !
Je ne pense pas que cela soit intégré directement dans javac, mais si c'est standardisé il y a de forte chance que ce soit intégré directement dans les EDI.
Maintenant cela ne semble pas avoir beaucoup avancé... donc je ne sais pas si ce sera présent dans Java 7 ou pas...
a++
La différence c'est que l'objet d'une inner-class reste relié à la classe l'englobant. Il est a une visibilité limitée a cette classe, et accès direct aux attributs/méthodes de cette classe, ...
on ne lit jamais assez les manuels: les annotations de findbugs m'avaient échappé! (je trouve les règles générales de cet outil beaucoup plus pertinentes que celles de checkstyle).
ça me semble un minimum; les règles sur les préconditions sont probablement plus dures à implanter. .... mais a première vue beaucoup de choses seraient faisables.
merci!
Oui, ça serait un fichier .java séparé mais qui fonctionnerait comme une inner classe et qui hériterait des particularités que j'ai cité.
Par exemple:Pourrait donner quequechose comme:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 //fichier Main.java public class Main { int a = 0; Main() { SousClasse sc = new SousClasse(); sc = new SousClasse(); } public static void main(String[] args) { Main m = new Main(); System.out.println("resultat: " + m.a); } class SousClasse { SousClasse() { a++; } } }
Si SousClasse est une classe séparée, elle ne pourrait pas accéder à la variable "a". De plus un objet de type SousClasse n'est instanciable que depuis un objet de la classe Main contrairement a une classe séparée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 //fichier Main.java public class Main { int a = 0; Main() { SousClasse sc = new SousClasse(); sc = new SousClasse(); } public static void main(String[] args) { Main m = new Main(); System.out.println("resultat: " + m.a); } } //Fichier Main$SousClasse.java class Main.SousClasse { SousClasse() { a++; } }
Bref les inner-classe sans des fichier séparés ne me parait pas une idée idiote. Ça pourrait être un gain en lisibilité si les inner-classes sont très grosses. Mais à mon avis, c'est loin d'être indispensable au vu de la complexité de l'évolution par rapport au gain.
Partager