Bonjour,
Je pense que je vieillis ...
En guise d'objet à données d'entrées pour mon programme, j'ai de grandes arrays à plusieurs types d'éléments, du genre :
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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    final static Object[] formTarif_Belgacom =
    {  
        new Object[]
        {   
            FormTarif_Libellés_0903.get_FormTarif_Libellés(),  // static
            new String( "<html><font color=green>Belgacom</font></html>" ),
            new Object[]
            {   new String( "2010 mai" ),
                new String( "2010 mei" )
            },
            null,
            null,
            new BigDecimal( 2.345 ),
            new BigDecimal( 1.234 )
        },
        // Ensemble de données tarifaires propres au 10 oct.
        new Object[]    // [0] : 2010 Mai
        {   new Object[] // District A
            {   new Object[] // 
                {   new Object[] // Aanbod
                    {   new Object[]
                        {   new String( "Contrat de 1 an" ),
                            new String( "1 jaar contract" )
                        },
                        new Boolean(Prix.indexés.enBooléen()),
                        new Object[]
                        {   new Object[]
                            {   null,
                                new Object[] // [0] : Normaal
                                { new BigDecimal( 50.00 ),
                                  new BigDecimal(  9.91 )
                                },
                                new Object[] // [1]
                                { new BigDecimal( 50.00 ),
                                  new BigDecimal( 12.89 ),
                                  new BigDecimal(  5.69 )
                                },
                                new Object[] // [2]
                                { new BigDecimal( 50.00 ),
                                  new BigDecimal(  4.88 )
                                }
                            }
                        }
                    }
                },
                new Object[] // Contributions
                {   new BigDecimal( 0.303 )
...
Soit des arrays imbriquées, de longueurs d'éléments variables et de types d'éléments différents.

J'ai aussi une très grande fonction réentrante ajoutant des Strings de libellés à chaque élément de ces objets de données d'entrée, en supprimant certains éléments, ... du genre :
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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
    private ArrayList<Object> assocLibellésAuxItemsDonnées(Object[] chaîneSource)
    {   byte nbreEléments = (byte) chaîneSource.length;
        // Pas de multiples threads d'accès ni de modification structurelle.
        ArrayList<Object> chaîneCible =
                new ArrayList<Object>(nbreEléments);
        Object descendant = null;
 
        boucleExtérieure:
        for (int index = 0; index < nbreEléments; index++)
        {   // Ajout du String se trouvant dans le fichier de libellés.
            // Object car élément est de type String, Boolean, Object[], BigDecimal ou null
            Object élément = chaîneSource[index];
            // ifs et switch-cases imbriqués de ±5.600 lignes !
            if (élément instanceof String)
            {   switch (nivRéentr[1])
                { case 0:   // nivRéentr[1]     // Il n'y a pas de String à ce niveau 0.
                    break;
                  case 1:   // nivRéentr[1]
                    switch (indexCheminArbor[0])
                    { case 0:  // indexCheminArbor[0] / nivRéentr[1]=1
                        // Données identiques pour tous les sous-ensembles inclus dans l'Object indexCheminArbor[0] = 1.
                        switch (indexCheminArbor[1])
                        { case 0:  // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
                            // FormTarif_Libellés_YYMM
                            break;
                          case 1:  // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
                            // <html><font color=green>Belgacom</font></html>
                            dénomFournis = (String) élément;
                            // Libellé déjà fourni en première position dans chaque 'new Object[]' de 'SommaireFormTarif_ComposTarif_YYMM'.
                            continue boucleExtérieure;
                          case 2:
                            // Au cas où String unique (pas Object de deux strings de deux langues.
                            // Mois d'application du tarif - "2010 mai"
                            moisDApplication = (String) élément;
                            break;
                          case 3:  // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
                            // Dénominations de formules tarifaires et les statuts
                            formTarif_DénomDsFichDEntrée[0] = (String) élément;
                            break;
                          case 4:  // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
                            // Dénominations de formules tarifaires et les statuts
                            break;
                          case 5:  // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
                            break;
                          case 6:  // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
                            break;
                          default: // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
                            break;
                        }
                        break;
                      case 1:  // indexCheminArbor[0] / nivRéentr[1]=1
                        // Ensemble de données tarifaires propres au YYMM.
                        // Il n'y a pas de String à ce niveau indexCheminArbor[0]=1.
                        break;
                      default: // indexCheminArbor[0] / nivRéentr[1]=0
                        break;
                    }
                    break;
                  case 2:   // nivRéentr[1]
                    switch (indexCheminArbor[0])
                    { case 0:  // indexCheminArbor[0] / nivRéentr[1]=2
...
            if (élément instanceof Object)
            {   switch (nivRéentr[1])
                { case 0:   // nivRéentr[1]
                    switch (indexCheminArbor[0])
                    { case 0:  // indexCheminArbor[0] / nivRéentr[1]=0
                        // Entrer dans l'Object '0' de nivRéentr[1]=0 :
                        break;
                      case 1:  // indexCheminArbor[0] / nivRéentr[1]=0
                        // Ensemble de données tarifaires propres au YYMM.
                        // Entrer dans l'Object '1' de nivRéentr[1]=0.
                        break;
                      default: // indexCheminArbor[0] / nivRéentr[1]=0
                        break;
                    }
                    break;
                  case 1:   // nivRéentr[1]
                    switch (indexCheminArbor[0])
                    { case 0:  // indexCheminArbor[0] / nivRéentr[1]=1
                        // Entré dans l'objet '0' de nivRéentr[1]=0.
                        // Données identiques pour tous les sous-ensembles inclus dans le 2e Object.
                        switch (indexCheminArbor[1])
                        { case 0:  // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
                            // Référence vers 'FormTarif_Libellés_1003'
                            formTarif_Libellés = (Object[]) élément;
                            // élément.get_FormTarif_Libellés();
                            chaîneCible.ensureCapacity(nbreEléments + 70);  // Pour tous les libellés à ajouter.
                            nivRéentr[0] = nivRéentr[1];
                            indexCheminArbor[nivRéentr[1]]++;
                            // Ne pas créer l'Object 'FormTarif_Libellés_1003'.
                            continue boucleExtérieure;
                          case 2:  // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
                            // Libellé en deux langues : '2010 mai' toujours en un Object de 2 strings.
                            élément = (String) chaîneSource[index][0];
                            break;
                          case 3:  // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
                            // Dénomination de la formule tarifaire en 2 strings bilingues.
                            break;
                          case 4:  // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
                            // Statuts d'indexation
                            break;
                          case 8:  // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
                            // nbreElem_lim = (BigDecimal[])((Object[])((Object[])formTarif_Données[0])[8]).length;
                            break;
                          default: // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
                            break;
                        }
                        break;
                      case 1:  // indexCheminArbor[0] / nivRéentr[1]=1
Une douzaine de lignes avant la fin, observez le code problématique
élément = (String) chaîneSource[index][0];
En mode de déboguage (en NetBeans), j'observe que l'array "new Object[]" est initialisé comme il se doit avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
                        {   new String( "2010 mai" ),
                new String( "2010 mei" )
                        },
Pour mettre en 'élément' l'une des deux valeurs de cette array initialisée, comment dois-je formuler mon code ? Le compilateur-life rouspète :
"Array required; but java.lang.Object found"
Remerciements anticipés.