7
votes

Java: Pour chaque boucle, itération sur des objets étendus

Ma question pourrait être très simple,

J'ai une classe résultat avec des champs intérieurs, des setters et des getters.

En outre, j'ai la classe spéciale1Result qui s'étend résultat et comprend plusieurs champs et spécial2result avec quelques données supplémentaires.

dans différents classes Dispatcher , j'ai écrit la méthode suivante:

ProcessResults (liste Résultats) , qui est uniquement familier avec résultat (j'ai besoin de cette méthode pour interroger s'il existe un champ spécifique dans le résultat étendu Objet - J'utilise des annotations).

J'ai donc décidé d'utiliser l'étendue pour-chaque boucle: pour (résultat res: résultats) {}

Alors, quelle est ma question? J'essaie de trouver sur le Web comment écrire ceci pour une boucle pour des objets étendus, par ex. Quelque chose comme ça pour (? étend les résultats Res: résultats) {}

est-ce possible? Comment est la bonne façon de l'écrire?


0 commentaires

4 Réponses :


5
votes

Tout ce que vous connaissez sur une liste est que chaque élément sera un résultat - c'est tout ce que vous pouvez mettre en valeur amélioré pour la syntaxe de boucle.

Si vous avez besoin de membres qui ne sont pas déclarés dans < code> résultat , vous devez lancer à l'intérieur de la boucle: xxx

pense à ce que vous écririez si vous écrivez si vous n'étiez pas utiliser une boucle améliorée - vous devez toujours écrire la distribution, n'est-ce pas?

Bien sûr, si vous savez que la liste doit vraiment contient uniquement Un type spécifique, vous pouvez toujours jeter inconditionnellement dans la boucle.


3 commentaires

+1, merci, bien que je ne puissiez pas demander quel est l'instanceOf, car je ne connais pas les différents types de résultats spéciaux dans la classe Dispatcher


@Michael: Ensuite, vous n'avez pas pu utiliser sensiblement cette différence de toute façon, de sorte que cela n'aura pas d'importance, non? Pourquoi voudriez-vous veut d'avoir une variable d'un type que vous ne pouviez pas prédire?


Il est souvent utilisé lorsque vous programmez avec une équipe distante, on est responsable du cadre et vous permet d'étendre leurs objets aussi longtemps que vous utilisez un format prédéfini, à l'aide d'annotations par exemple. Le produit que je travaille implémente cette conception et je souhaite l'étendre un peu. Utilisation d'Annotation (@interface) Vous pouvez indiquer à l'utilisateur de Super Class, quels champs sont importants, quels types doivent être inspectés et plus ... Le concepteur-cadre doit encore être en mesure de faire face à un objet étendu par différents développeurs sans savoir ce que mis en œuvre.



1
votes

Java a une effacement de type - Les paramètres de type concret des collections ne sont pas présents au moment de l'exécution.

Donc, si vous avez une liste, le compilateur Java s'assurera qu'aucun code ne mit à ne rien mettre dans la liste qui n'est pas une sous-classe de résultat.

En conséquence, au moment de l'exécution, toute votre boucle peut savoir, c'est que le contenu est toutes des sous-classes de résultat - le seul moyen de boucler est donc un ensemble de références au résultat, avec tout comportement polymorphique présent en conséquence. de toute sous-classes figurant dans la liste.


1 commentaires

+1, merci, dans le passé que si vous lancez un plus grand objet étendu à un plus petit objet de super classe, vous risquez de perdre certaines des caractéristiques de la classe.



3
votes

J'essaie de trouver sur le Web comment écrire ceci pour une boucle pour des objets étendus, par ex. quelque chose comme ça XXX

Non, ce n'est pas possible: vous ne pouvez pas taper statiquement les éléments fournis de manière dynamique au moment de l'exécution.

Comment est la bonne façon de l'écrire?

Vous le faites déjà: xxx

si vous souhaitez tester pour spécial2result à l'intérieur de cette boucle, vous pouvez faire Cela, mais il dit généralement que votre conception peut être améliorée. Une meilleure alternative consiste à utiliser un mécanisme de double envisage, tel que le modèle de visiteur < / a>, pour masquer les détails du traitement spécial pour vos sous-classes.


1 commentaires

+1 Merci, je vais vérifier comment je peux utiliser le modèle de visiteur ici.



1
votes

Étant donné que vos sublasses de béton ne diffèrent que par la nature des champs, je vous suggère de bénéficier d'un simple polymorphisme.

Vous vous retrouveriez avec un résultat code> interface / classe abstrait définissant un Exécuter () Code> Classe de méthode mise en œuvre par autant de classes ou de sous-classes que vous avez besoin de contenir des actions à faire. p>

Par conséquent, votre code client pourrait simplement utiliser: P>

for (Result res : results){    //results being as a List<Result> type
  res.execute(); 
}


0 commentaires