UHP - ESSTIN - Département d' Informatique
« Equivalence »
Java 5.0 | Java 1.4
(c)
~/2A env. - Cr.:
08.03.2005
Dernière Màj. :
20.08.2006 19h57 / H. Nguyen-Phu
Cette annexe permet une adaptation en amont des nouvelles fonctionnalités du JDK 5.0.
Autoboxing
|
|
Integer
enveloppe = n; |
Integer enveloppe = new
Integer(n); |
Pour transformer une enveloppe en une valeur de type primitive, ajouter des appels aux méthodes |
‘intValue’, ‘doubleValue’, etc ... |
int n =
enveloppe ; |
int n = enveloppe.intValue() ; |
|
|
Listes de tableaux génériques
|
|
ArrayList<TypeC> anArrayList = new ArrayList<TypeC>(); |
ArrayList anArrayList = new ArrayList(); |
anArrayList.get(i); |
(TypeC) anArrayList.get(i); |
|
|
Listes de paramètres variables
Les paramètres doivent être regroupés dans un tableau pour JDK 1.4 |
|
|
|
Méthode(autres param., p1, p2, p3) |
Méthode(autres param., new Type[]{p1, p2,
p3}) |
|
|
Boucle ‘for’ améliorée
i.e. ‘POUR ...
PARMI’
|
|
TypeC E []=
new E[25]; |
TypeC E []=
new E[25]; |
TypeC e; |
TypeC e; |
for (e : E)
{ // E: un tableau
|
for (int i = 0 ; i < E.length; i++ )
{ |
... // A indenter ! |
e = E[i]; ... // A indenter ! |
} // e : un élément de E |
} // cf. exemple: moyenne.java |
|
|
for (variable
de type : arrayList) { |
for (int
j = 0; j < arrayList.size(); j++)
{ |
|
variable de type = (TypeC) arrayList.get(j); |
... // A indenter |
... // A indenter |
} |
} |
Importations
statiques pour Java 5.0
|
|
import static
java.lang.Math.*; |
// Pas de prise en charge avec la version JDK 1.4 et les versions antérieures … |
import static
java.lang.System.*; |
// Cependant, on peut alléger via ‘jo’ (cf. ~/2A env.) : |
|
static
PrintWriter jo= new
PrintWriter(System.out, true); |
out.println(1d/sqrt(2d*PI)); |
jo.println(1d/Math.sqrt(2d*Math.PI)) ; |
Emploi de la classe ‘Scanner’ de JDK 5.0 pour la saisie au
clavier
Avant JDK 5.0, utiliser ‘JOptionPane.showInputDialog’ par exemple ou via la classe ‘es.java’ |
|
import java.util.* ; … Scanner jin =
new
Scanner(System.in); System.out.print(“Taper qqc :
”); |
import
javax.swing.*; … String txt=
JOptionPane.showInputDialog(“Taper
qqc: ”); // ou
String txt =
es.LireCh(“Taper qqc: ”); |
int m = jin.nextInt(); |
int m = Integer.parseInt(txt); |
long n = jin.nextLong(); |
long n = Long.parseLong(txt); |
float x =
jin.nextFloat(); |
float x = Float.parseFloat(txt); |
double x =
jin.nextDouble(); |
double x =
Double.parseDouble(txt); |
String mot= jin.next(); |
String mot = txt; |
String phrase = jin.nextLine(); cf. tscan et vscanner.java |
String phrase = txt;
|
Emploi de la méthode ‘printf’ de JDK 5.0 pour formater la sortie (cf. ‘printf’ du langage C)
Avant JDK 5.0, utiliser par exemple ‘NumberFormat.getNumberInstance’. |
|
System.out.printf(“%8.2f”,
x); |
NumberFormat forma =
NumberFormat.getNumberInstance(); forma.setMinimumFractionDigits(2); forma.setMaximumFractionDigits(2); String formatted = forma.format(x) ; for(int i = formatted.length(); i < 8;
i++)
System.out.print(“
“); System.out.print(formatted); |
Il existe aussi :
“%d %9.2e %14.7e
%23.16 e
… %s” etc… |
cf. consulter les utilitaires ‘tpp’ ou ‘lju’ pour plus de détails … |
Délégation
du volet conteneur
Avant JDK 5.0, les classes JFrame, JDialog et JApplet ne déléguaient pas les appels ‘add’ et ‘setLayout’ au volet conteneur. |
|
add(component); |
getContentPane().add(component); |
setLayout(manager); |
getContentPane().setLayout(manager); |
|
|
Construction de chaînes
de caractères
La version JDK 5.0
introduit la classe ‘StringBuilder’ (cf. chaine2_.java) dont les méthodes ne sont
pas synchronisées, ce qui la rend un peu plus efficace que
‘StringBuffer’. |
|
StringBuilder |
StringBuffer |
Points de code
Unicode (norme 4.0)
La version JDK 5.0
prend en charge la norme Unicode 4.0 dans laquelle les caractères
« supplémentaires » sont codés avec deux valeurs ‘char’
consécutives (cf. chaine3.java). |
|
int
cp = aString.codePointAt(i);
if
(Character.isSupplementaryCodePoint(cp)) |
char cp = aString.charAt(i); // A omettre avec JDK 1.4 |
Types de retour
covariants
Avec JDK 5.0, on peut utiliser un sous-type dans la méthode
de remplacement. Exemple typique avec la méthode ‘clone’ : |
|
public Employee clone() { . . . }
. . . Employee cloned = e.clone(); |
public Object clone() { . .
. } … Employee
cloned = (Employee) e.clone(); |
Mesure de
durées d’exécution
Avec JDK 5.0, on peut utiliser la nouvelle méthode
‘System.nanoTime()’ qui fournit la durée en nano-seconde. Il est
cependant nécessaire d’amplifier pour toute durée d’exécution
inférieure à 100 ms. Exemple : |
|
// System.nanoTime()
// unité de mesure = ns ! . . . double
res ; long dateDeb = System.nanoTime(); for(int
i=0; i<10000000; i++) res = TraitementAMesurer(); long dateFin = System.nanoTime(); |
// System.currentTimeMillis() // unité de mesure = ms ! … double
res; long
dateDeb = System.currentTimeMillis(); for(int i=0; i < 10000000; i++) res = TraitementAMesurer(); long dateFin = System.currentTimeMillis(); |
La différence (dateFin
– dateDeb) donne la durée amplifiée à 10000000 fois dans cet exemple. Il
ne faut pas oublier de tenir compte aussi de la durée résiduelle (cf. erreur
systématique de la mesure) et de ramener, dans les deux cas, en unité S.I. i.e.
en seconde(s).