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 Juste Exemple: P> puis j'ai appelé ci-dessous constructeur pour chaque donnée d'enregistrement. p> 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 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. P> Est-ce que quelqu'un me suggère: p> Merci d'avance. p> p> initwidget code> de rowwidget code>. initwidget code>. Je veux transmettre chaque paramètre requis dans le constructeur uniquement comme p>
6 Réponses :
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. P>
Comment construire la classe qui ont la même propriété requise dans un autre exemple? p> blockQuote>
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 code> mot-clé. P>Quelle est la meilleure façon de construire la classe avec une propriété de correction par défaut pour toutes les instances? p> blockQuote>
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. P>
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.
Vous pouvez séparer / extraire les paramètres du crée maintenant une fois instance de cette classe et transmettez-la parmi les autres paramètres à Une autre alternative serait d'avoir usine code> pour créer Rowwidget Code> -Class FRO Exemple dans un RowwidgetConfig code> -Class. Rowwidget Code> Constructeur. P> 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 ...
}
}
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.
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 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> 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 RowGroup rowGroup
= new RowGroup(.....)
.addRow(DataRawType.A, dataA, parentA)
.addRow(DataRawType.B, dataB, parentB);
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);
}
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();
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.
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 code> ou
définir code> comme vous l'avez fait avec les autorisations de formulaireOuais 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 B>: Utilisez une carte
mappe Code> Pour contenir vos paramètres, remplissez une fois et transmettez cette carte à Rowwidget CODE> 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.