2017-10-03 1 views
0

J'écris une application Android en Java. Ma classe a deux constructeurs - un est utilisé lorsque les données sont passées directement et le second si la classe doit désérialiser les données du bundle. Tout ressemble plus à ce qui suit:Comment grouper les initialisations communes dans les constructeurs?

public class MyClass { 

    private final ObservableInt myField; 
    private final int data; 

    public MyClass(int data) { 

     myField = new ObservableInt(); 
     myField.addOnChangedListener(myListener); 

     this.data = data; 
    } 

    public MyClass(Bundle bundle) { 

     myField = new ObservableInt(); 
     myField.addOnChangedListener(myListener); 

     this.data = bundle.getInt("SomeName"); 
    } 
} 

Considérons le ci-dessus un exemple simple. J'ai beaucoup plus de champs finaux à remplir et aussi beaucoup plus de champs de type data.

noter maintenant que ce code est répété dans chaque constructeur:

 myField = new ObservableInt(); 
     myField.addOnChangedListener(myListener); 

Je voudrais factoriser à seul endroit pour éviter les problèmes SECS. J'ai essayé de créer le constructeur privé et appelez this() dans chacun des constructeurs ci-dessus, mais le compilateur se plaint, ce champ "de données" n'a pas été initialisé et je ne veux pas le passer par le paramètre à ce constructeur privé, parce que dans mon Il y a beaucoup de data à remplir.

Répondre

1

Vous pouvez essayer d'utiliser initia Lists comme ça:

public class MyClass { 
    private final ObservableInt myField = new ObservableInt(); 
    private final int data; 
    { 
     myField.addOnChangedListener(myListener); 
    } 

    public MyClass(int data) { 
     this.data = data; 
    } 

    public MyClass(Bundle bundle) { 
     this(bundle.getInt("SomeName")); 
    } 
} 
+0

c'est ce qu'il a déjà et ce qu'il ne veut plus ne pas répéter le 'this.data =' deux fois (si j'ai compris sa question) –

+0

@PierGiorgioMisley Non, pas vraiment. Je ne veux pas répéter 'myField = new ObservableInt()' et 'myField.addOnChangeListener (myListener);'. Je suppose que cela peut effectivement résoudre mon problème. – Spook

+0

@Spook oooh alors je dois probablement me rendormir! Désolé pour mon incompréhension! –

-1

essayé de créer constructeur privé et appeler ce()

Vous pourriez ne pas être toujours possible d'aller pour les peaux sèches, mais dans votre cas, je chaîne les constructeurs:

public class MyClass { 

    private final ObservableInt myField; 
    private final int data; 

    public MyClass(int data) { 
     myField = new ObservableInt(); 
     myField.addOnChangedListener(myListener); 

     this.data = data; 
    } 

    public MyClass(Bundle bundle) { 
     this(bundle.getInt("SomeName")); 
    } 
} 
-1

utilisez le constructeur "int" par défaut:

public class MyClass { 

    private final ObservableInt myField; 
    private final int data; 

    public MyClass(int data) { 
    myField = new ObservableInt(); 
    myField.addOnChangedListener(myListener); 
    this.data = data; 
    } 

    public MyClass(Bundle bundle) { 
    this(bundle.getInt("SomeName")); 
    } 
} 
+0

Alors maintenant vous avez supprimé votre commentaire stupide que vous avez posté sous ma réponse mais laissé votre downvote? C'est vraiment un comportement enfantin. –

+0

downvote? J'ai supprimé le commentaire parce que j'ai compris que vous modifiez votre réponse juste après avoir posté le mien et qu'ils sont exactement les mêmes que cela pourrait être une coïncidence compte tenu de la brièveté de la question. –