Esiste un equivalente di super per il reindirizzamento delle chiamate di metodo ai campi interni nelle classi wrapper

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

  •  05-07-2019
  •  | 
  •  

Domanda

Diciamo che voglio creare una classe MyString che è un wrapper per java.lang.String . Ho aggiunto un nuovo metodo chiamato reverse .

public class MyString {
    private String text=null;

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

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

Ora String è definitivo. Pertanto non posso estenderlo. Un modo per avere MyString supporta tutti i metodi supportati da String è fornire implementazioni del metodo wrapper come il metodo toCharArray () :

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

Esiste un modo in cui posso reindirizzare le chiamate di metodo al campo membro senza dover codificare l'implementazione del wrapper? Qualcosa di simile a super?

È stato utile?

Soluzione

No, questo non può essere fatto direttamente.

Potresti definire un'interfaccia contenente tutti i metodi java.lang.String (più i tuoi metodi) e implementarla con un proxy dinamico reindirizzando all'implementazione della stringa (con tutte le implicazioni negative di proxy dinamici ).

Probabilmente stai meglio con una conversione di tipo nuovo MyString (string) .reverse () sfortunatamente Java non ha metodi di estensione di C # o conversioni di tipo implicito di Scala .

Esistono ovviamente molte implementazioni inverse , ad esempio dalla libreria commons apache . È implementato in uno stile procedurale:

String reversed = StringUtils.reverse(string);

(Penso che il tuo metodo inverso dovrebbe restituire MyString non String in modo da poter scrivere: s.reverse (). reverse () ).

Altri suggerimenti

Non sono sicuro di aver compreso completamente la domanda, ma alla fine, se vuoi che il tuo MyString abbia tutti gli stessi metodi di String , a un certo livello la tua classe deve hanno anche tutti gli stessi metodi definiti. Non puoi davvero aggirare questo.

Probabilmente puoi trovare modi accurati in modo che per ogni metodo non devi digitare return text.blah () , qualcosa di più elegante di così; ma non vedo in alcun modo come potresti evitare di avere le definizioni dei metodi nel tuo MyString .

Non puoi farlo poiché devi scrivere i metodi per esporli per l'uso. Ad esempio, puoi utilizzare " Crea delegati ... " di Netbeans funzione e ottieni tutti i metodi delegati con alcuni clic del mouse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top