Le stockage de différents types d'éléments dans une Liste en Java
Je suis en train de développer un tableau général chargeur de schéma qui est connu au moment de l'exécution. Cela nécessite d'avoir une classe qui contient une liste des différents types d'éléments et prend en charge diverses méthodes get et set comme getInt(int index)
, asString(int index)
, asStringList(int index)
. Les types d'éléments que je considère sont Integer
, Double
, String
, et List<Integer>
, List<Double>
et List<String>
. Le type réel de chaque élément est connu au moment de l'exécution, et je vais les stocker dans une Liste décrivant son schéma pour la poursuite du traitement.
Ma question est: dois-je conserver cette liste d'éléments dans List<Object>
ou List<? extends Object>
? ou est-il la meilleure façon de mettre en œuvre une telle classe?
List<Whatever>
devient List
, donc pas de chance ici, vous devez avoir deux ensembles de classesC'est une très mauvaise odeur de code vous y êtes arrivé.
Roach: j'ai compris la raison pour laquelle j'ai besoin de cette.
Roach: je sais faire les choses mal pourrait être méchant, c'est pour ça que je demande. Pouvez-vous fournir une manière plus propre de faire cela?
Je pense que dasblinkenlight a une assez propre solution qui évite l'ensemble de la liste type de problème. Fondamentalement, il est à l'aide d'un bon principe de la programmation orientée objet: préférer la composition au cours de l'héritage.
OriginalL'auteur keelar | 2013-06-14
Vous devez vous connecter pour publier un commentaire.
Depuis l'ancêtre commun de vos cours est
Object
, et parce queList<? extends Object>
ne pas rendre les choses plus propres (après tout, tout ce qui s'étendObject
) il ressemble àList<Object>
serait OK choix.Cependant, une telle liste serait un sac mélangé: vous devez vérifier le type à l'exécution de l'objet à l'intérieur, et de prendre des décisions sur cette base. Ce n'est certainement pas une bonne chose.
Une meilleure solution serait de créer votre propre classe qui implémente les opérations sur les éléments de la liste de la manière uniforme, et d'en faire une sous-classe pour chaque sous-type qui implémente ces opérations différemment. Cela vous permettrait de traiter la liste d'une manière uniforme, en poussant le par-objet de la différenciation dans vos papiers d'emballage.
Maintenant, vous pouvez faire une liste de
ItemWrapper
objets, etcalculateSomething
sans vérification de leur type:Parce que c'était mon copier/coller de l'erreur 🙂 Merci pour le tuyau.
ma liste est toujours vide et l'impression est inaccessible. Comment pouvons-nous ajouter tout ItemWrapper à ma liste avant de faire la boucle, si il n'y a pas de ItemWrapper classe (uniquement l'interface)?
Je ne suis pas sûr de comprendre votre question. La meilleure façon de poser une question de suivi est de poser une nouvelle question, plutôt que de faire des commentaires, car de cette façon, vous obtenez l'accès complet au code marque-place, vous permettant de fournir un meilleur exemple de ce que vous essayez de le demander.
OriginalL'auteur dasblinkenlight
Vous devez utiliser
List<Object>
, ou quelle que soit la super-classe est le plus proche de l'ajustement. Une fois, j'ai posé une question similaire qui a amassé quelques très bonnes réponses qui a beaucoup d'informations pertinentes pour vous. Je voudrais vérifier. Fondamentalement, il s'agit de PECS - Producteur s'Étend, de la Consommation de Super.pas de problème. a eu un problème similaire une fois 🙂
OriginalL'auteur oligofren