Existe-t-il un équivalent de super pour rediriger les appels de méthode vers des champs internes dans les classes wrapper

StackOverflow https://stackoverflow.com/questions/1603291

  •  05-07-2019
  •  | 
  •  

Question

Supposons que je souhaite créer une classe MyString , qui est un wrapper pour java.lang.String . J'ai ajouté une nouvelle méthode appelée reverse .

public class MyString {
    private String text=null;

    public MyString(String foo){
        text=foo;
    }

    public String reverse(){
        // implementation omitted
        return reversedString;  
    }
}

Maintenant, String est final. Par conséquent, je ne peux pas l'étendre. Pour que MyString prenne en charge toutes les méthodes prises en charge par String , vous pouvez fournir des implémentations de méthodes d'encapsulation telles que la méthode toCharArray () :

public char[] toCharArray(){
    // redirect to String member field 'text'
    return text.toCharArray();
}

Est-il possible de rediriger les appels de méthode vers le champ membre sans avoir à coder l'implémentation du wrapper? Quelque chose de semblable au super?

Était-ce utile?

La solution

Non, cela ne peut pas être fait directement.

Vous pouvez définir une interface contenant toutes les méthodes java.lang.String (ainsi que vos méthodes) et l'implémenter avec un proxy dynamique vers l'implémentation de chaîne (avec toutes les implications négatives de mandataires dynamiques ).

Vous êtes probablement mieux avec une conversion de type new MyString (string) .reverse () malheureusement, Java n'a pas Les méthodes d'extension de C # ou Conversions de type implicite de Scala .

Il existe bien sûr de nombreuses implémentations inverses , par exemple, à partir de bibliothèque apache commons . Il est implémenté dans un style procédural:

String reversed = StringUtils.reverse(string);

(Je pense que votre méthode inverse devrait renvoyer MyString not String afin que vous puissiez écrire: s.reverse (). reverse () ).

Autres conseils

Je ne suis pas sûr de bien comprendre la question, mais si vous voulez que votre MyString utilise les mêmes méthodes que String , votre classe doit ont également toutes les mêmes méthodes définies. Vous ne pouvez pas vraiment contourner cela.

Vous pouvez probablement trouver de bonnes méthodes pour ne pas avoir à taper return text.blah () pour chaque méthode, quelque chose de plus élégant que cela; mais je ne vois pas comment vous pourriez éviter d'avoir les définitions de méthodes dans votre MyString .

Vous ne pouvez pas faire cela car vous devez écrire les méthodes pour les exposer pour les utiliser. Mais, par exemple, vous pouvez utiliser l'option "Créer des délégués ..." de Netbeans. fonction et vous obtenez toutes les méthodes de délégation en quelques clics de souris.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top