6
votes

Ajout de méthodes d'existence en classe dans Android

Je cherche un moyen d'ajouter des méthodes dans des cours existantes comme ceci: xxx pré>

dans l'objectif c, je peux utiliser catégorie pour faire cela. p>

 public class ProxyProvider{
       Provider provider;
       public ProxyProvider(Provider provider){
           this.provider = provider;
       }
       public void print(){
           String name = provider.getName();
           //do something
       }
 }


1 commentaires

"parce que c'est comme une classe d'emballage, je dois stocker un objet avec de nombreux champs et méthodes pour n'utiliser qu'une seule méthode" => pas vraiment, il ne fait que stocker une référence à l'objet, donc d'une mémoire perspective, il ne devrait pas avoir d'impact significatif.


4 Réponses :


0
votes

En Java, une classe peut être étendue à l'aide d'héritage régulier, sauf si elle finale . chaîne est final , car les chaînes sont immuables et sont donc protégées intentionnellement contre le sous-classement.

En outre, l'ajout de comportement par sous-classement est considéré comme une mauvaise pratique dans de nombreux cas - l'accouplement est tout simplement trop fort et colle avec vous pour des instances de vos objets que vous allez jamais créer. La règle de base est "favorable à la composition sur l'héritage".

Cela dit, il existe de nombreuses approches / motifs pour résoudre votre problème particulier. décorateur pourrait être le modèle que vous recherchez.

Veuillez mettre à jour votre question ou poster un nouveau avec plus d'informations.


0 commentaires

1
votes

Il n'est pas possible, cependant, il existe une Java comme DSL Disponible appelée Xtend qui peut être utilisée comme remplacement convaincant pour Java qui pourrait fonctionner à la recherche des méthodes de vulgarisation telles que celle-ci.

http://www.eclipse.org/xtend/

Disclaimer: Je ne suis en aucun cas associé à cela, je ne suis qu'un utilisateur avide de la technologie principale utilisée pour créer Xtend appelé xtext. J'ai envisagé d'utiliser Xtend sur un projet Android


0 commentaires

0
votes

Essayez d'étendre la classe en question et d'y ajouter vos méthodes. Si cela ne peut pas être fait (comme si cela a été dit, la chaîne est finale), écrivez simplement une enveloppe autour avec les méthodes que vous souhaitez et l'objet que vous souhaitez prolonger.

Comme p>

 public class MyString
 {
    private String internal;

    //your methods
 }


1 commentaires

Je pense que votre réponse est ce que je fais dans la question mise à jour. Je donne aussi mon vrai problème dans la question mise à jour, veuillez lire attentivement.



4
votes

Vous pouvez créer une classe utilitaire avec des méthodes statiques: xxx

dans votre code, vous pouvez ensuite l'appeler: xxx

et Si cette classe a seulement une méthode d'impression , vous pouvez peut-être appeler IT fournisseurPrinter au lieu de fournisseur u .

à la fin Vous n'avez pas de milliers de possibilités - vous pouvez:

  • étend la classe et quelle que soit la méthode dont vous avez besoin dans la sous-classe => Vous avez dit que vous ne voulez pas que
  • Modifiez le code source de la classe et recompilez votre propre version du JAR
  • enveloppez la classe dans une enveloppe qui ajoute les méthodes dont vous avez besoin (votre exemple proxyprovider)
  • Mettez les méthodes dont vous avez besoin dans une classe d'utilité statique (ce que j'ai proposé ci-dessus)
  • Modifiez la classe à l'exécution et ajoutez une méthode, mais C'est un chemin compliqué parce que vous devez jouer avec des chargeurs de classe.

6 commentaires

Merci, mais pouvez-vous confirmer s'il s'agit ou non d'ajouter une méthode dans une classe? Devrais-je utiliser l'ajout de méthode ou de votre chemin?


@ R4j Voir mon édition. Il n'y a pas de meilleure façon: cela dépend vraiment de votre condition et de la raison pour laquelle vous devez le faire, que vous n'expliquez pas vraiment. Les méthodes de classe d'utilitaire d'emballage ou d'utilitaire statique sont les plus exposées à l'intrusion et aux erreurs.


Merci je l'ai eu. Permettez-moi de clarifier, les exigences ne permettent pas d'utiliser l'héritage, et je souhaite trouver le meilleur moyen de résoudre des problèmes (c'est bien que cela ajoutez des méthodes également, mais maintenant je ne suis pas sûr). Alors, pourriez-vous me recommander que dois-je faire?


J'aime cette réponse, je pense que c'est la voie à suivre en Java. Pour moi, c'était complètement le contraire; J'ai commencé à coder dans l'objectif C et était très surpris que vous puissiez faire cela :)


Merci! @ R4J La méthode d'emballage et la classe d'utilité sont similaires - j'utiliserais la classe de services publics car (a) cela permet d'économiser la création d'un objet et d'avoir une empreinte de mémoire inférieure si vous devez traiter de nombreux fournisseurs et (b) c'est le fil Coffre-fort et (c) il garde les choses simples.


@assylie merci, cela m'a sauvé beaucoup de temps.