Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Spring] utiliser une constante

6 réponses
Avatar
Jogo
Bonjour,

Je voudrait donner à une propriété la valeur d'une constante, et je ne
sais pas comment faire. En gros, j'ai :

class Flu {
public static final int TITI ;
public void setProp(int titi);
}

Et je voudrait faire :

<bean name="flu" class="Flu">
<property name="prop" value="TITI"/>
</bean>

Est-ce possible ?

--
On ne rentre pas dans un zombi si on peut s'en dispenser.
-- T. Pratchett

6 réponses

Avatar
Jean-Michel
Bonjour,

Il y'a deux manière d'initialiser une variable final static:

1) lors de la déclaration:
public static final int TITI = 0;

2) dans un bloc static:
public static final int TITI;
static {
//Ici on peux mettre du cjava (genre ouverture d'un fichier de config)
TITI = 0;
}

Ce blog sera executé au plus une fois (lors du chargement de ta classe
dans la JVM)

Pour ton cas, initialiser la variable en fonction dd'un fichier de
conf, tu devrait utiliser la version 2.

Par contre ton fichier <bean ... me fait penser à une conf spring,
dans ce cas ça ne marchera pas.



On Aug 21, 11:05 am, Jogo wrote:
Bonjour,

Je voudrait donner à une propriété la valeur d'une constante, et je ne
sais pas comment faire. En gros, j'ai :

class Flu {
public static final int TITI ;
public void setProp(int titi);

}

Et je voudrait faire :

<bean name="flu" class="Flu">
<property name="prop" value="TITI"/>
</bean>

Est-ce possible ?

--
On ne rentre pas dans un zombi si on peut s'en dispenser.
-- T. Pratchett


Avatar
Jogo
Il y'a deux manière d'initialiser une variable final static:

[snip]

Pour ton cas, initialiser la variable en fonction dd'un fichier de
conf, tu devrait utiliser la version 2.

Par contre ton fichier <bean ... me fait penser à une conf spring,
dans ce cas ça ne marchera pas.


Ralala, c'est pénible ce google groups qui vire les balises des sujets
(il y avait la balise [Spring] à l'origine). Mais c'est vrai que
j'aurais du repréciser dans le sujet. Il ne s'agissait donc pas
d'initialiser un membre static final, mais de donner à une propriété la
valeur d'un membre static en utilisant Spring. Ce problème est fréquent
en fait avec les classes qui n'utilisent pas les enum.

Voici un exemple peut-être plus parlant :

/* Classe dont je ne vois pas le code source.
* Je ne connais donc pas en réalité la valeur réelle des A.cas*.
*/
public class A {
public static final int casA = 1;
public static final int casB = 2;
public static final int casC = 3;

public A(int cas) {
...
}
}

/* Ma classe à moi qui utilise la classe A
*/
public class B {
private A ref = null;

public void setRef(int cas) {
ref = new A(cas);
}
}

<!-- Ce que je voudrait dans mon app.xml pour Spring -->
<bean id="truc" class="domain.projet.B">
<property name="ref" value="A.casB" />
</bean>

Voilà, mais ça bien sûr, ça ne marche pas. Il y a-t-il une façon de
faire pareil qui mache ?

--
The perfect man is the true partner. Not a bed partner nor a fun
partner, but a man who will shoulder burdens equally with [you] and
possess that quality of joy.
-- Erica Jong

Avatar
ToOmS
On 22 août, 13:41, Jogo wrote:
Il y'a deux manière d'initialiser une variable final static:

[snip]

Pour ton cas, initialiser la variable en fonction dd'un fichier de
conf, tu devrait utiliser la version 2.

Par contre ton fichier <bean ... me fait penser à une conf spring,
dans ce cas ça ne marchera pas.


Ralala, c'est pénible ce google groups qui vire les balises des sujets
(il y avait la balise [Spring] à l'origine). Mais c'est vrai que
j'aurais du repréciser dans le sujet. Il ne s'agissait donc pas
d'initialiser un membre static final, mais de donner à une propriét é la
valeur d'un membre static en utilisant Spring. Ce problème est fréque nt
en fait avec les classes qui n'utilisent pas les enum.

Voici un exemple peut-être plus parlant :

/* Classe dont je ne vois pas le code source.
* Je ne connais donc pas en réalité la valeur réelle des A.cas*.
*/
public class A {
public static final int casA = 1;
public static final int casB = 2;
public static final int casC = 3;

public A(int cas) {
...
}

}

/* Ma classe à moi qui utilise la classe A
*/
public class B {
private A ref = null;

public void setRef(int cas) {
ref = new A(cas);
}

}

<!-- Ce que je voudrait dans mon app.xml pour Spring -->
<bean id="truc" class="domain.projet.B">
<property name="ref" value="A.casB" />
</bean>

Voilà, mais ça bien sûr, ça ne marche pas. Il y a-t-il une faço n de
faire pareil qui mache ?

--
The perfect man is the true partner. Not a bed partner nor a fun
partner, but a man who will shoulder burdens equally with [you] and
possess that quality of joy.
-- Erica Jong


Après tout, les constantes ne sont qu'un outil de conception...
Pourquoi ne pas initialiser une VARIABLE à NULL et provoquer une
exception dans le setter si la valeur précédente est différente de
NULL ?
Tant qu'on y est, on peut lever une exception dans le getter si la
valeur est NULL, à tout hasard.


Avatar
ToOmS
On 22 août, 13:41, Jogo wrote:
Il y'a deux manière d'initialiser une variable final static:

[snip]

Pour ton cas, initialiser la variable en fonction dd'un fichier de
conf, tu devrait utiliser la version 2.

Par contre ton fichier <bean ... me fait penser à une conf spring,
dans ce cas ça ne marchera pas.


Ralala, c'est pénible ce google groups qui vire les balises des sujets
(il y avait la balise [Spring] à l'origine). Mais c'est vrai que
j'aurais du repréciser dans le sujet. Il ne s'agissait donc pas
d'initialiser un membre static final, mais de donner à une propriét é la
valeur d'un membre static en utilisant Spring. Ce problème est fréque nt
en fait avec les classes qui n'utilisent pas les enum.

Voici un exemple peut-être plus parlant :

/* Classe dont je ne vois pas le code source.
* Je ne connais donc pas en réalité la valeur réelle des A.cas*.
*/
public class A {
public static final int casA = 1;
public static final int casB = 2;
public static final int casC = 3;

public A(int cas) {
...
}

}

/* Ma classe à moi qui utilise la classe A
*/
public class B {
private A ref = null;

public void setRef(int cas) {
ref = new A(cas);
}

}

<!-- Ce que je voudrait dans mon app.xml pour Spring -->
<bean id="truc" class="domain.projet.B">
<property name="ref" value="A.casB" />
</bean>

Voilà, mais ça bien sûr, ça ne marche pas. Il y a-t-il une faço n de
faire pareil qui mache ?

--
The perfect man is the true partner. Not a bed partner nor a fun
partner, but a man who will shoulder burdens equally with [you] and
possess that quality of joy.
-- Erica Jong


Autre idée, sous Spring notamment : utiliser un singleton d'une classe
ne contenant que cette valeur (ou un ensemble de valeurs que l'on
souhaite constantes et que l'on fixe dans le fichier d'injection).
C'est plus facile à contrôler en configuration (ici) qu'en exécution
(exceptions dans les accesseurs).


Avatar
Tom
Voilà comment utiliser les constantes avec Spring :

<bean name="MA_CONSTANTE" id="org.xxx.yyy.MA_CONSTANTE"
class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/>


On 22 août, 13:41, Jogo wrote:
Il y'a deux manière d'initialiser une variable final static:
[snip]
Pour ton cas, initialiser la variable en fonction dd'un fichier de
conf, tu devrait utiliser la version 2.
Par contre ton fichier <bean ... me fait penser à une conf spring,
dans ce cas ça ne marchera pas.
Ralala, c'est pénible ce google groups qui vire les balises des sujets

(il y avait la balise [Spring] à l'origine). Mais c'est vrai que
j'aurais du repréciser dans le sujet. Il ne s'agissait donc pas
d'initialiser un membre static final, mais de donner à une propriété la
valeur d'un membre static en utilisant Spring. Ce problème est fréquent
en fait avec les classes qui n'utilisent pas les enum.

Voici un exemple peut-être plus parlant :

/* Classe dont je ne vois pas le code source.
* Je ne connais donc pas en réalité la valeur réelle des A.cas*.
*/
public class A {
public static final int casA = 1;
public static final int casB = 2;
public static final int casC = 3;

public A(int cas) {
...
}

}

/* Ma classe à moi qui utilise la classe A
*/
public class B {
private A ref = null;

public void setRef(int cas) {
ref = new A(cas);
}

}

<!-- Ce que je voudrait dans mon app.xml pour Spring -->
<bean id="truc" class="domain.projet.B">
<property name="ref" value="A.casB" />
</bean>

Voilà, mais ça bien sûr, ça ne marche pas. Il y a-t-il une façon de
faire pareil qui mache ?

--
The perfect man is the true partner. Not a bed partner nor a fun
partner, but a man who will shoulder burdens equally with [you] and
possess that quality of joy.
-- Erica Jong


Autre idée, sous Spring notamment : utiliser un singleton d'une classe
ne contenant que cette valeur (ou un ensemble de valeurs que l'on
souhaite constantes et que l'on fixe dans le fichier d'injection).
C'est plus facile à contrôler en configuration (ici) qu'en exécution
(exceptions dans les accesseurs).





Avatar
ToOmS
On 10 sep, 12:21, Tom wrote:
Voilà comment utiliser les constantes avec Spring :

<bean name="MA_CONSTANTE" id="org.xxx.yyy.MA_CONSTANTE"
class="org.springframework.beans.factory.config.FieldRetrievingFactoryB ean"­/>

Merci, bien vu.

Pour une explication un peu plus diserte : http://www.unicon.net/node/601