Classe de paire générique
Juste d'essayer cette question j'ai trouvé dans un passé feuille d'examen, de sorte que je peux me préparer pour une prochaine Java examen.
Fournir une classe générique Paire pour représenter les paires de choses. La classe doit fournir un constructeur, une méthode pour obtenir le premier membre de la paire, une méthode pour obtenir le deuxième membre de la paire, une méthode pour définir le premier membre de la paire, une méthode d'établissement du second membre de la paire. La classe doit être paramétré sur deux types un pour le premier membre et un pour le deuxième membre de la paire.
Est-ce une mise en œuvre correcte pour cette question ?
public class Pair<firstThing, secondThing>{
private firstThing first;//first member of pair
private secondThing second;//second member of pair
public Pair(firstThing first, secondThing second){
this.first = first;
this.second = second;
}
public void setFirst(firstThing first){
this.first = first;
}
public void setSecond(secondThing second) {
this.second = second;
}
public thing getFirst() {
return this.first;
}
public thing getSecond() {
return this.second;
}
}
source d'informationauteur John Curtsy
Vous devez vous connecter pour publier un commentaire.
Presque. Je préfère l'écrire comme ceci:
Edit: je suis d'accord avec @karmakaze commentaire. Le code doit ignorer les organismes de normalisation et de faire des première et deuxième finale de la garder immuable.
La nécessité d'une Paire de classe habituellement les cultures en place, dans les grands projets - je suis en train de (re)mettre en œuvre un pour le projet en cours (comme les précédentes implémentations ne sont pas accessibles).
Généralement je fais immuable POJO, avec une fonction de commodité pour créer des instances. Par exemple:
De sorte que l'utilisateur peut écrire:
et
Comme mentionné ci-dessus, la Paire classe doit également mettre en œuvre hashCode(), equals(), facultatif mais utile toString(), comme peut-être le clone() et compareTo() pour une utilisation lorsque ceux-ci sont pris en charge par T et U - si le travail supplémentaire est nécessaire pour décrire la façon dont ces contrats sont pris en charge par la Paire de classe.
Vous pouvez regarder à la mise en œuvre de la norme des classes Java AbstractMap.SimpleEntry et AbstractMap.SimpleImmutableEntry. Il est assez facile de google sources:
Ici est une mise en œuvre à partir de l'Android SDK
Je crois que Non. Citation:
Je pense qu'ils attendent en termes de :
Généralement un générique Paire de type a deux paramètres de type générique, pas - de sorte que vous pourriez avoir (par exemple) un
Pair<String, Integer>
. C'est généralement plus utile, de l'OMI.Je dirais aussi que vous pensez est plus classique nom pour votre type de paramètre que la "chose". Par exemple, vous pouvez utiliser
Pair<A, B>
ouPair<T, U>
.Getters sont cassés
thing
doit être remplacé parthis
Après le montage, il semble bon.
Cependant, vous devriez vraiment mettre en œuvre les
hashCode
etequals
de méthodes, de sorte que deux paires contenant les mêmes objets sont égaux les uns aux autres, et peuvent être utilisés comme clés dans une table de hachage. EttoString
si vous vous sentez généreux. Ces méthodes ne sont pas tenus de satisfaire aux exigences que vous avez été donnés, mais ils sont des choses qu'un bon programmeur devrait ajouter.Vous n'avez qu'un seul paramètre.
vous besoin de quelque chose comme
Pair<F,S>
et l'utilisation de F lorsque vous utilisezthing
pour le premier et S oùthing
pour la deuxième.Pas. Avez-vous essayé de coder ça pour voir si ça fonctionne?
Vous semblez avoir raté cette partie de l'exigence:
Ce qui signifie que la classe devrait probablement être définie comme quelque chose de plus comme:
public class Pair<T1, T2>
et les autres méthodes de mise à jour en conséquence. (En passant, j'ai utilisé T1 et T2 pour désigner les types comme par convention, un court - 1 ou 2 char - identificateur est utilisé).
Aussi,
return thing.first;
et
return thing.second;
ne sont pas aller au travail, comme dans votre exemple,
thing
est un type, pas un objet. Pensez ce que vous voulez revenir ici. Avez-vous encore besoin d'appeler une méthode?Une fois que vous avez fait vos modifications, le code, puis d'écrire un test unitaire ou un simple test-harnais pour vérifier si cela fonctionne.
Apache Commons Lang a un générique paire de mise en œuvre
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/Pair.html
thing
est un Variable de Type dans une inhabituelle notation - nous avons l'habitude d'utiliser une majuscule-ci (commeT
). Ensuite: une variable de type n'a pas de méthodes, de sorte que votre getters ne compile pas.Rapide amélioration: remplacer tous les
thing
avecT
Solution rapide pour les accesseurs:
Une exigence était de permettre à deux types différents pour la paire de membres. Donc la classe de signature devrait ressembler à:
Ma version de la Paire. Ce gère également les compare.
PS : la Plupart du code est issu du PSBA.
J'ai mis en place quelque chose de similaire, mais avec statique builder et les chaînes de setters