Si j'utilise le type Date (oui je sais c'est mal mais je me pose la question), qui est muable, comme paramètre d'une case class.
case class PasBien( date: Date )
Comment je fais pour pouvoir redéfinir la valeur date dans le corps du constructeur pour ne pas récupérer la référence de Date mais une autre et ne pas retourner la référence de ma classe mais une clonée.
Une idée ?
Le 2 novembre 2012 16:51, Ugo Bourdon <bourdon....@gmail.com> a écrit :
> Comment je fais pour pouvoir redéfinir la valeur date dans le corps du
> constructeur pour ne pas récupérer la référence de Date mais une autre et
> ne pas retourner la référence de ma classe mais une clonée.
Je ne suis pas sûr d'avoir bien compris la question, mais si tu cherches à
retourner une instance d'une classe autre que celle dont tu appelles le
constructeur, tu ne peux pas : le constructeur ne retourne rien, il
construit le contenu d'une instance qui a déjà été créée, c'est son rôle.
Envisage de passer par une usine (factory) si c'est ce que tu souhaites.
Quand tu code une case class Meeting(date: Date) , c'est en fait du sucre
syntaxique qui génère :
- Une méthode apply sur l'object compagnon Meeting
- Et la méthode unapply pour le pattern matching, mais là j'ai pas les
détail en tête.
Si tu as par exemple au départ ça :
case class Meeting(date: Date)
Tu voudrais obtenir ça, pour la copie défensive :
class Meeting(pDate: Date) {
def date = ... // clonage de la date pDate
}
Mais pour que cela continue de se comporter comme un case class, il
faudriat ajouter à la main le code qui est généré tout seul quand tu as le
modificateur case.
Soit sur l'objet compagnon (dans le même fichier de code source)
object Meeting() {
def apply(pDate: Date) = new Meeting(pDate)
}
Plus le unapply pour le pattern matching...
A ce sujet, je crois qu'il y a déjà une présentation qui a circulé ci surle
pattern matching qui détaillait le unapply.
Le 2 novembre 2012 16:56, Samuel Tardieu <s...@rfc1149.net> a écrit :
> Le 2 novembre 2012 16:51, Ugo Bourdon <bourdon....@gmail.com> a écrit :
>> Comment je fais pour pouvoir redéfinir la valeur date dans le corps du
>> constructeur pour ne pas récupérer la référence de Date mais une autre et
>> ne pas retourner la référence de ma classe mais une clonée.
> Je ne suis pas sûr d'avoir bien compris la question, mais si tu cherches à
> retourner une instance d'une classe autre que celle dont tu appelles le
> constructeur, tu ne peux pas : le constructeur ne retourne rien, il
> construit le contenu d'une instance qui a déjà été créée, c'est son rôle.
> Envisage de passer par une usine (factory) si c'est ce que tu souhaites.
En gros en java je peux faire public class MyClass {
private final Date date;
public MyClass( final Date date) {
this.date = new Date( date.getTime )
}
public Date getDate() {
return date.clone();
}
}
et je veux faire un truc du genre avec une case class
Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com <javascript:>>a écrit :
>> Comment je fais pour pouvoir redéfinir la valeur date dans le corps du >> constructeur pour ne pas récupérer la référence de Date mais une autre et >> ne pas retourner la référence de ma classe mais une clonée.
> Je ne suis pas sûr d'avoir bien compris la question, mais si tu cherches à > retourner une instance d'une classe autre que celle dont tu appelles le > constructeur, tu ne peux pas : le constructeur ne retourne rien, il > construit le contenu d'une instance qui a déjà été créée, c'est son rôle. > Envisage de passer par une usine (factory) si c'est ce que tu souhaites.
> En gros en java je peux faire
> public class MyClass {
> private final Date date;
> public MyClass( final Date date) {
> this.date = new Date( date.getTime )
> }
> public Date getDate() {
> return date.clone();
> }
> }
> et je veux faire un truc du genre avec une case class
> Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
>> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com> a écrit :
>>> Comment je fais pour pouvoir redéfinir la valeur date dans le corps du
>>> constructeur pour ne pas récupérer la référence de Date mais une autre et
>>> ne pas retourner la référence de ma classe mais une clonée.
>> Je ne suis pas sûr d'avoir bien compris la question, mais si tu cherches
>> à retourner une instance d'une classe autre que celle dont tu appelles le
>> constructeur, tu ne peux pas : le constructeur ne retourne rien, il
>> construit le contenu d'une instance qui a déjà été créée, c'est son rôle.
>> Envisage de passer par une usine (factory) si c'est ce que tu souhaites.
> En gros en java je peux faire > public class MyClass {
> private final Date date;
> public MyClass( final Date date) {
> this.date = new Date( date.getTime )
> }
> public Date getDate() {
> return date.clone();
> }
> }
> et je veux faire un truc du genre avec une case class
> Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com> a écrit :
> Comment je fais pour pouvoir redéfinir la valeur date dans le corps du constructeur pour ne pas récupérer la référence de Date mais une autre et ne pas retourner la référence de ma classe mais une clonée.
> Je ne suis pas sûr d'avoir bien compris la question, mais si tu cherches à retourner une instance d'une classe autre que celle dont tu appelles le constructeur, tu ne peux pas : le constructeur ne retourne rien, il construit le contenu d'une instance qui a déjà été créée, c'est son rôle. Envisage de passer par une usine (factory) si c'est ce que tu souhaites.
> Si j'utilise le type Date (oui je sais c'est mal mais je me pose la
> question), qui est muable, comme paramètre d'une case class.
> case class PasBien( date: Date )
> Comment je fais pour pouvoir redéfinir la valeur date dans le corps du
> constructeur pour ne pas récupérer la référence de Date mais une autre et
> ne pas retourner la référence de ma classe mais une clonée.
> Une idée ?
> En gros en java je peux faire
> public class MyClass {
> private final Date date;
> public MyClass( final Date date) {
> this.date = new Date( date.getTime )
> }
> public Date getDate() {
> return date.clone();
> }
> }
> et je veux faire un truc du genre avec une case class
> Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
>> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com> a écrit :
>>> Comment je fais pour pouvoir redéfinir la valeur date dans le corps du
>>> constructeur pour ne pas récupérer la référence de Date mais une autre et
>>> ne pas retourner la référence de ma classe mais une clonée.
>> Je ne suis pas sûr d'avoir bien compris la question, mais si tu cherches
>> à retourner une instance d'une classe autre que celle dont tu appelles le
>> constructeur, tu ne peux pas : le constructeur ne retourne rien, il
>> construit le contenu d'une instance qui a déjà été créée, c'est son rôle.
>> Envisage de passer par une usine (factory) si c'est ce que tu souhaites.
>> En gros en java je peux faire
>> public class MyClass {
>> private final Date date;
>> public MyClass( final Date date) {
>> this.date = new Date( date.getTime )
>> }
>> public Date getDate() {
>> return date.clone();
>> }
>> }
>> et je veux faire un truc du genre avec une case class
>> Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
>>> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com> a écrit :
>>>> Comment je fais pour pouvoir redéfinir la valeur date dans le corps du
>>>> constructeur pour ne pas récupérer la référence de Date mais une autre et
>>>> ne pas retourner la référence de ma classe mais une clonée.
>>> Je ne suis pas sûr d'avoir bien compris la question, mais si tu cherches
>>> à retourner une instance d'une classe autre que celle dont tu appelles le
>>> constructeur, tu ne peux pas : le constructeur ne retourne rien, il
>>> construit le contenu d'une instance qui a déjà été créée, c'est son rôle.
>>> Envisage de passer par une usine (factory) si c'est ce que tu souhaites.
>> En gros en java je peux faire
>> public class MyClass {
>> private final Date date;
>> public MyClass( final Date date) {
>> this.date = new Date( date.getTime )
>> }
>> public Date getDate() {
>> return date.clone();
>> }
>> }
>> et je veux faire un truc du genre avec une case class
>> Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
>>> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com> a écrit :
>>>> Comment je fais pour pouvoir redéfinir la valeur date dans le corps du
>>>> constructeur pour ne pas récupérer la référence de Date mais une autre et
>>>> ne pas retourner la référence de ma classe mais une clonée.
>>> Je ne suis pas sûr d'avoir bien compris la question, mais si tu cherches
>>> à retourner une instance d'une classe autre que celle dont tu appelles le
>>> constructeur, tu ne peux pas : le constructeur ne retourne rien, il
>>> construit le contenu d'une instance qui a déjà été créée, c'est son rôle.
>>> Envisage de passer par une usine (factory) si c'est ce que tu souhaites.
>>> En gros en java je peux faire
>>> public class MyClass {
>>> private final Date date;
>>> public MyClass( final Date date) {
>>> this.date = new Date( date.getTime )
>>> }
>>> public Date getDate() {
>>> return date.clone();
>>> }
>>> }
>>> et je veux faire un truc du genre avec une case class
>>> Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
>>>> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com> a écrit :
>>>>> Comment je fais pour pouvoir redéfinir la valeur date dans le corps du
>>>>> constructeur pour ne pas récupérer la référence de Date mais une autre et
>>>>> ne pas retourner la référence de ma classe mais une clonée.
>>>> Je ne suis pas sûr d'avoir bien compris la question, mais si tu
>>>> cherches à retourner une instance d'une classe autre que celle dont tu
>>>> appelles le constructeur, tu ne peux pas : le constructeur ne retourne
>>>> rien, il construit le contenu d'une instance qui a déjà été créée, c'est
>>>> son rôle. Envisage de passer par une usine (factory) si c'est ce que tu
>>>> souhaites.
>>>> En gros en java je peux faire
>>>> public class MyClass {
>>>> private final Date date;
>>>> public MyClass( final Date date) {
>>>> this.date = new Date( date.getTime )
>>>> }
>>>> public Date getDate() {
>>>> return date.clone();
>>>> }
>>>> }
>>>> et je veux faire un truc du genre avec une case class
>>>> Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
>>>>> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com> a écrit :
>>>>>> Comment je fais pour pouvoir redéfinir la valeur date dans le corps
>>>>>> du constructeur pour ne pas récupérer la référence de Date mais une autre
>>>>>> et ne pas retourner la référence de ma classe mais une clonée.
>>>>> Je ne suis pas sûr d'avoir bien compris la question, mais si tu
>>>>> cherches à retourner une instance d'une classe autre que celle dont tu
>>>>> appelles le constructeur, tu ne peux pas : le constructeur ne retourne
>>>>> rien, il construit le contenu d'une instance qui a déjà été créée, c'est
>>>>> son rôle. Envisage de passer par une usine (factory) si c'est ce que tu
>>>>> souhaites.
>>>>> En gros en java je peux faire
>>>>> public class MyClass {
>>>>> private final Date date;
>>>>> public MyClass( final Date date) {
>>>>> this.date = new Date( date.getTime )
>>>>> }
>>>>> public Date getDate() {
>>>>> return date.clone();
>>>>> }
>>>>> }
>>>>> et je veux faire un truc du genre avec une case class
>>>>> Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
>>>>>> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com> a écrit :
>>>>>>> Comment je fais pour pouvoir redéfinir la valeur date dans le corps
>>>>>>> du constructeur pour ne pas récupérer la référence de Date mais une autre
>>>>>>> et ne pas retourner la référence de ma classe mais une clonée.
>>>>>> Je ne suis pas sûr d'avoir bien compris la question, mais si tu
>>>>>> cherches à retourner une instance d'une classe autre que celle dont tu
>>>>>> appelles le constructeur, tu ne peux pas : le constructeur ne retourne
>>>>>> rien, il construit le contenu d'une instance qui a déjà été créée, c'est
>>>>>> son rôle. Envisage de passer par une usine (factory) si c'est ce que tu
>>>>>> souhaites.
case class MyClass( myStringField: String, state: Boolean, private val test: Test ) {
private val _test = new Test( test.int )
def getTest: Test = _test
}
Et pour info j'ai pas besoin de ca. Juste une recherche pour l'écriture d'un article sur mon blog.
Le vendredi 2 novembre 2012 17:44:40 UTC+1, Nicolas Dasriaux a écrit :
>>>>>> En gros en java je peux faire >>>>>> public class MyClass {
>>>>>> private final Date date;
>>>>>> public MyClass( final Date date) {
>>>>>> this.date = new Date( date.getTime )
>>>>>> }
>>>>>> public Date getDate() {
>>>>>> return date.clone();
>>>>>> }
>>>>>> }
>>>>>> et je veux faire un truc du genre avec une case class
>>>>>> Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
>>>>>>> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com> a écrit :
>>>>>>>> Comment je fais pour pouvoir redéfinir la valeur date dans le corps >>>>>>>> du constructeur pour ne pas récupérer la référence de Date mais une autre >>>>>>>> et ne pas retourner la référence de ma classe mais une clonée.
>>>>>>> Je ne suis pas sûr d'avoir bien compris la question, mais si tu >>>>>>> cherches à retourner une instance d'une classe autre que celle dont tu >>>>>>> appelles le constructeur, tu ne peux pas : le constructeur ne retourne >>>>>>> rien, il construit le contenu d'une instance qui a déjà été créée, c'est >>>>>>> son rôle. Envisage de passer par une usine (factory) si c'est ce que tu >>>>>>> souhaites.
1) Il me semble que pour les case class, le modificateur val est implicite
sur tous les paramètres du constructeur.
Donc, dans le contexte d'une case class, il me semble que :
private val test: Test
est équivalent à
private test: Test
2) Tu te retrouve avec 2 champs (mais j'ai quand même un doute sur ce que
je dis) :
- test
- _test
3) C'est pas terrible pour le principe d'uniformité d'accès : on voudrait
une méthode test et pas getTest, non ?
Le 2 novembre 2012 17:59, Ugo Bourdon <bourdon....@gmail.com> a écrit :
> case class MyClass( myStringField: String, state: Boolean, private val
> test: Test ) {
> private val _test = new Test( test.int )
> def getTest: Test = _test
> }
> Et pour info j'ai pas besoin de ca. Juste une recherche pour l'écriture
> d'un article sur mon blog.
> Le vendredi 2 novembre 2012 17:44:40 UTC+1, Nicolas Dasriaux a écrit :
>> Je me disais bien que j'oubliais quelque chose. ;-)
>> Le 2 novembre 2012 17:41, Jérôme Mainaud <jer...@mainaud.com> a écrit :
>>> J'ai vu, ton exemple a croisé ma réponse. :-)
>>> Le case class apporte aussi les méthodes equals, hashCode et toString.
>>>>>>> En gros en java je peux faire
>>>>>>> public class MyClass {
>>>>>>> private final Date date;
>>>>>>> public MyClass( final Date date) {
>>>>>>> this.date = new Date( date.getTime )
>>>>>>> }
>>>>>>> public Date getDate() {
>>>>>>> return date.clone();
>>>>>>> }
>>>>>>> }
>>>>>>> et je veux faire un truc du genre avec une case class
>>>>>>> Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
>>>>>>>> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com> a écrit
>>>>>>>> :
>>>>>>>>> Comment je fais pour pouvoir redéfinir la valeur date dans le
>>>>>>>>> corps du constructeur pour ne pas récupérer la référence de Date mais une
>>>>>>>>> autre et ne pas retourner la référence de ma classe mais une clonée.
>>>>>>>> Je ne suis pas sûr d'avoir bien compris la question, mais si tu
>>>>>>>> cherches à retourner une instance d'une classe autre que celle dont tu
>>>>>>>> appelles le constructeur, tu ne peux pas : le constructeur ne retourne
>>>>>>>> rien, il construit le contenu d'une instance qui a déjà été créée, c'est
>>>>>>>> son rôle. Envisage de passer par une usine (factory) si c'est ce que tu
>>>>>>>> souhaites.
> 1) Il me semble que pour les case class, le modificateur val est implicite
> sur tous les paramètres du constructeur.
> Donc, dans le contexte d'une case class, il me semble que :
> private val test: Test
> est équivalent à
> private test: Test
> 2) Tu te retrouve avec 2 champs (mais j'ai quand même un doute sur ce que
> je dis) :
> - test
> - _test
> 3) C'est pas terrible pour le principe d'uniformité d'accès : on voudrait
> une méthode test et pas getTest, non ?
> Le 2 novembre 2012 17:59, Ugo Bourdon <bourdon....@gmail.com> a écrit :
> En fait si on fait ca, ca devrait suffire :
>> case class MyClass( myStringField: String, state: Boolean, private val
>> test: Test ) {
>> private val _test = new Test( test.int )
>> def getTest: Test = _test
>> }
>> Et pour info j'ai pas besoin de ca. Juste une recherche pour l'écriture
>> d'un article sur mon blog.
>> Le vendredi 2 novembre 2012 17:44:40 UTC+1, Nicolas Dasriaux a écrit :
>>> Je me disais bien que j'oubliais quelque chose. ;-)
>>> Le 2 novembre 2012 17:41, Jérôme Mainaud <jer...@mainaud.com> a écrit :
>>>> J'ai vu, ton exemple a croisé ma réponse. :-)
>>>> Le case class apporte aussi les méthodes equals, hashCode et toString.
>>>>>>>> En gros en java je peux faire
>>>>>>>> public class MyClass {
>>>>>>>> private final Date date;
>>>>>>>> public MyClass( final Date date) {
>>>>>>>> this.date = new Date( date.getTime )
>>>>>>>> }
>>>>>>>> public Date getDate() {
>>>>>>>> return date.clone();
>>>>>>>> }
>>>>>>>> }
>>>>>>>> et je veux faire un truc du genre avec une case class
>>>>>>>> Le vendredi 2 novembre 2012 16:57:09 UTC+1, Samuel Tardieu a écrit :
>>>>>>>>> Le 2 novembre 2012 16:51, Ugo Bourdon <bourd...@gmail.com> a
>>>>>>>>> écrit :
>>>>>>>>>> Comment je fais pour pouvoir redéfinir la valeur date dans le
>>>>>>>>>> corps du constructeur pour ne pas récupérer la référence de Date mais une
>>>>>>>>>> autre et ne pas retourner la référence de ma classe mais une clonée.
>>>>>>>>> Je ne suis pas sûr d'avoir bien compris la question, mais si tu
>>>>>>>>> cherches à retourner une instance d'une classe autre que celle dont tu
>>>>>>>>> appelles le constructeur, tu ne peux pas : le constructeur ne retourne
>>>>>>>>> rien, il construit le contenu d'une instance qui a déjà été créée, c'est
>>>>>>>>> son rôle. Envisage de passer par une usine (factory) si c'est ce que tu
>>>>>>>>> souhaites.