8
votes

Meilleure façon de passer des arguments dans le constructeur

J'ai une classe qui crée des lignes dans la disposition de la table. La création de la ligne dépend des données et des métadonnées. Comme les métadonnées sont identiques pour chaque ligne comme émission / masquez les propriétés de visibilité, etc. Donc, j'ai créé une propriété de métadonnées en tant que statique et initialisez une fois que vous utilisez initwidget de rowwidget .

Juste Exemple: xxx

puis j'ai appelé ci-dessous constructeur pour chaque donnée d'enregistrement. xxx

Comme je pensais que ce n'est pas une bonne approche . Parce que comme modèle quand quelqu'un voit cette classe, comprenez cela créera une ligne. Je ne veux pas appeler initialement initwidget . Je veux transmettre chaque paramètre requis dans le constructeur uniquement comme xxx

mais en raison de cela, le constructeur n'a aucun argument. Et je pense que c'est aussi mauvais modèle d'avoir plus de 5 paramètres dans le constructeur.

Est-ce que quelqu'un me suggère:

  • Comment construire la classe qui ont la même propriété requise dans une autre instance?

    note : Je sais que cela est possible par statique seulement mais ne veut pas utiliser statique.

    • Quelle est la meilleure façon de construire la classe avec un correctif par défaut Propriété pour toutes les instances?

      note : Je ne veux pas créer une autre classe pour y parvenir. ou une méthode getter / setter.

      Merci d'avance.


7 commentaires

Vous pouvez réduire la longueur de votre liste de paramètres un peu si vous avez transféré les paramètres booléens en une carte ou définir comme vous l'avez fait avec les autorisations de formulaire


Ouais je peux. N'importe qui n'a pas d'autre approche. Je vais y aller.


Eh bien, si vous ne voulez pas vraiment de nouvelles classes, vous souhaitez vous débarrasser de la liste des paramètres statiques et longues, que diriez-vous de cette suggestion Dirty : Utilisez une carte mappe Pour contenir vos paramètres, remplissez une fois et transmettez cette carte à Rowwidget Consturctor et obtenez-les + les jeter à utiliser lors de la construction. Ceci est pire que d'avoir une longue liste de paramètres depuis la dernière fois que la dernière est plus explicite sur quels paramètres la classe a besoin et plus lisible / maintenable. Vous devriez également reconsidérer votre conception. Qu'est-ce qui vous détient d'introduire une nouvelle classe?


@ A4L Hehe C'était exactement ma première idée quand je lisais la note sans nouvelle classe, mais je n'ai pas osé le suggérer;)


@Marcoforberg hah ... C'est pourquoi il ne vint que comme commentaire ;-)


@ A4L Je suis d'accord avec vous que ce sont les pires cas .. Et c'est confondre .. c'est bien. J'ai ajouté cette question dans le cas de votre doute d'opinion d'expert. avez-vous une idée?


@Bhumika malheureusement, je ne peux pas penser à d'autres idées autres que déjà ci-dessus.


6 Réponses :


0
votes

Pourquoi ne pas créer de méthode qui acceptera les newvalues ​​pour les propriétés que vous souhaitez modifier et renvoyer une nouvelle instance des classes avec toutes les autres propriétés copiées de l'instance sur laquelle vous avez appelé cette méthode.


0 commentaires

0
votes

Comment construire la classe qui ont la même propriété requise dans un autre exemple?

Pour aller faire cela, vous pouvez avoir une super classe avec toutes les propriétés souhaitées. Donc, toute classe extension de cette super classe aura ces propriétés. De cette façon, vous n'avez pas besoin d'utiliser statique mot-clé.

Quelle est la meilleure façon de construire la classe avec une propriété de correction par défaut pour toutes les instances?

Pour celui-ci, vous pouvez avoir une interface avec des propriétés constantes. De cette façon, toute classe mettant en œuvre cette interface aura les propriétés fixes.


2 commentaires

Je sais avec Super Class mais vous voulez lire ma question. Je n'en ai pas besoin. Afaik Super Class a besoin lorsque le nombre de contrôles a la même propriété. Ici, je n'ai qu'un seul contrôle. et pour initialiser Super classe, j'ai besoin de constructeur. droit? Donc, aussi je dois transmettre des arguments à quel point il est là. comment?


@Bhumika: Depuis que vous avez les mêmes propriétés pour plusieurs contrôles, vous pouvez simplement les définir dans la super classe. Vous aurez donc besoin du constructeur de non-argument par défaut.



0
votes

Vous pouvez séparer / extraire les paramètres du Rowwidget Code> -Class FRO Exemple dans un RowwidgetConfig code> -Class. xxx pré>

crée maintenant une fois instance de cette classe et transmettez-la parmi les autres paramètres à Rowwidget Code> Constructeur. P>

Une autre alternative serait d'avoir usine code> pour créer rowwidget code> instances. L'usine contiendrait également tous les paramètres dont vous avez besoin pour une instance de ligne plus une méthode d'usine créenewrowwwidget code> crée une base d'instance sur les paramètres contenus dans l'usine. P>

class RowWidgetFactory {
    // put here all your parameters that you need to initialize only once
    // init using setters

    public RowWidget createNewRowWidget() {
        // create
        return ...
    }
}


5 commentaires

L'OP a dit qu'il ne voulait pas une autre classe. "Remarque: je ne veux pas créer une autre classe pour y parvenir."


@Marcoforberg Oops, j'ai raté ce détail: /


Mais je dois admettre qu'une classe de configuration était la première chose qui a jeté à mon esprit; 9


@Marcoforberg Je suis vraiment curieux comment cela peut être fait! Je vais supprimer cette réponse car elle n'est pas utile pour OP.


Moi aussi! Je pense qu'une classe de configuration serait bien, malgré le fait qu'il ne veut pas une nouvelle classe.



0
votes

La chose de statique initwidget () ne me semble tout simplement pas correcte pour moi. Bien que probablement maintenant, vous n'aurez probablement qu'un ensemble de rowwidget code> S Partage des propriétés, il est également raisonnable d'avoir 2 ensembles de rowwidget code> s, chaque ensemble aura sa propre " "Propriétés partagées. Les choses vont être beaucoup plus couramment et vous aurez beaucoup plus de choix dans la construction d'API plus raisonnables si vous refacteur votre code pour faire un design plus raisonnable

Supposons maintenant, je présente quelque chose comme un groupe de rangs (ce qui représente le type «partagé» que vous mentionné) p>

(Honnêtement, je n'ai pas tout à fait la signification de votre conception, je ne fais que créer une base sur votre code); p>

RowGroup rowGroup 
        = new RowGroup(.....)
              .addRow(DataRawType.A, dataA, parentA)
              .addRow(DataRawType.B, dataB, parentB);


0 commentaires

0
votes

Si vous ne vouliez pas créer une autre classe, je suggérerais ce que A4L a suggéré. Sans créer une autre classe, je créerais un constructeur qui prend tous les paramètres et la méthode d'usine utilisant l'instance actuelle en tant que modèle et transmettez ses propres paramètres sur le paramètre Constructor.

Exemple (avec des pièces évidentes OMMITH) P>

class A{
  public A(int p1, int p2){...}
  public A create(int p2) {
    return new A(this.p1,p2);
}


0 commentaires

1
votes

Je suggérerais un motif de constructeur. Vous auriez besoin d'une classe supplémentaire pour créer des objets Rowwidget. Donc, l'appel ressemblerait à ce que:

RowWidget widget = new RowWidget.Builder().withData(data).withParentData(parentData).withDataRawType(dataRawType).build();


2 commentaires

Mais ici il y a une chance de disparaître


Si vous devez vous assurer qu'aucun des arguments ne manque, il suffit d'effectuer une méthode de chèque de construction () et de lancer une exception si elle est.