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);
     ...  // autres instructions ...

  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).