Comment créer une Chaîne de classe réplique?
J'ai besoin de créer une classe avec exactement les mêmes méthodes que java.lang.String
.
Quelle est la meilleure façon de le faire en Java?
Je sais que je ne peux pas étendre la classe String comme il est final
. Je ne suis pas à la recherche à des solutions là où j'ai besoin de copier le code source de java.lang.String
. Par exemple, supposons que j'ai besoin de la fonctionnalité length()
au sein de ma classe personnalisée nommée MyString
, ce qui a une 'myLength()` méthode.
Quelle est la meilleure façon de mettre en œuvre myLength()
?
Je ne suis pas à la recherche à des algorithmes différents pour trouver la longueur d'une chaîne, mais à la réutilisation String
's length()
méthode. Maintenant, une fois que j'ai MyString
classe de prêt, je devrais être capable de l'utiliser n'importe où pour mon custom manipulations.
Je suis en train d'essayer de trouver de quel modèle serait le plus adapté pour ce genre de problème.
Je me suis toujours demandé si, pourquoi Chaîne est final en Java? Bien sûr, il fournit toutes les fonctionnalités dont j'ai besoin, et n'a jamais songé à une opération qui nécessiterait une extension de la classe String, mais encore, vous ne saurez jamais ce que quelqu'un pourrait avoir besoin!
le choix peut avoir plus à voir avec la sécurité que de la conception. Ne me demandez pas de préciser que si, comme je pense que c'est juste quelque chose que je peut (ou peut ne pas) avoir lu 😉
voir ici: stackoverflow.com/questions/2068804/why-string-is-final-in-java
OriginalL'auteur Thunderhashy | 2010-01-15
Vous devez vous connecter pour publier un commentaire.
De votre question, il semble que la chose que vous cherchez est simple délégation:
Harsha, ce que vous voulez n'est tout simplement pas possible.
Pouvez-vous expliquer?
J'ai ajouté une réponse à expliquer plus en détail de ces commentaires permettent.
Merci Paul.
OriginalL'auteur Fabian Steeg
En passant par les différentes réponses ici, et le askers mises à jour et précisions, il semble que ce que la personne veut, c'est une classe qui ressemble, les odeurs et les sons comme une Chaîne de caractères, mais ne l'est pas.
C'est qu'ils aimeraient être en mesure de le faire:
Cela ne peut pas fonctionner, car
java.lang.String
est le dernier de la classe, et donc à chaque"String"
que le compilateur produit sera unjava.lang.String
objet, puisque ce n'est pas unMyString
objet qu'ils ne peuvent pas être affectés les uns aux autres.Dans faiblement typé langues vous seriez en mesure de créer une classe, puisque si une classe regards, les odeurs et les sons comme un canard, ensuite, à toutes fins utiles, il est un canard. Java, cependant, est un langage fortement typé, et un canard n'est qu'un canard s'il arrive à être de la De la famille des anatidés, des oiseaux.
OriginalL'auteur Paul Wagland
Depuis
final
classes ne peut pas être sous-classé, créer une nouvelle classe qui a unString
exemple à l'intérieur et à opérer sur cet objet.OriginalL'auteur TBH
Je suppose que vous voulez dire
java.lang.String
. Cependant, vous ne pouvez pas remplacerString
avec votre propre classe. Vous pouvez faire une autre classe avec les mêmes méthodes (en copiant le code source et de modification de la déclaration du package), mais vous ne serez pas en mesure de passer les instances de cette classe de méthodes qui nécessitent unString
.Ce qui soulève une question importante: pourquoi pensez-vous que vous voulez faire?
Peut-être que c'était une question piège, et que vous étiez censé expliquer pourquoi cela vous empêcher d'inter-fonctionnement avec presque jamais existantes de l'API Java.
Une autre réponse à l'interview serait point que la Chaîne met en œuvre CharSequence et vous pouvez créer d'autres implémentations. Bien sûr, cela ne fonctionne pas si l'Api qui utilisent l'ersatz de chaîne nécessitent une Chaîne plutôt qu'une CharSequence.
OriginalL'auteur erickson
Proxy modèle de conception, je suppose. C'est une question stupide, mais que pas une réflexion sur le sens, mais sur la personne qui lui a demandé dans une entrevue d'emploi). Éventuellement, la personne qui vous n'arrivais pas à réaliser que la Chaîne est-elle définitive? Sinon, je ne vois pas pourquoi ils se seraient même demander.
OriginalL'auteur ZoFreX
Une nouvelle classe (il aura besoin d'un paquet différent, bien sûr, de mettre en œuvre la même interface et ajouter toutes les méthodes publiques de la classe String (lire la javadoc pour assurez-vous que vous avez tout).
Je suppose que c'est les devoirs.
OriginalL'auteur Yishai
Vous pouvez utiliser le refactoring: Remplacer l'héritage avec la délégation, qui, fondamentalement, est ( comme indiqué dans les réponses précédentes ) pour créer une variable d'instance du type désiré, et de mettre en œuvre toutes les méthodes dans la classe et faire passer le message.
Vous remarquerez que c'est beaucoup de frappe, c'est quand une bonne IDE vient à portée de main.
La vidéo suivante montre comment IntelliJ IDEA 9.
http://img43.imageshack.us/img43/5647/capturadepantalla201001k.png
OriginalL'auteur OscarRyz
Si vous voulez juste pour remplacer une partie de la Chaîne de comportement que vous pouvez essayer d'utiliser un proxy dynamique. Rechercher
java.lang.reflect.Proxy
dans l'API.OriginalL'auteur BigMikeW