Существует ли эквивалент super для перенаправления вызовов методов во внутренние поля в классах-обёртках?

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

  •  05-07-2019
  •  | 
  •  

Вопрос

Допустим, я хочу создать класс MyString , который является оболочкой для java.lang.String . Я добавил новый метод с именем reverse .

public class MyString {
    private String text=null;

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

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

Теперь String является окончательным. Поэтому я не могу продлить это. Один из способов, чтобы MyString поддерживал все методы, которые поддерживает String , заключается в предоставлении реализаций метода-оболочки, таких как метод toCharArray () :

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

Есть ли способ, которым я могу перенаправить вызовы метода в поле члена без необходимости кодировать реализацию оболочки? Что-то похожее на супер?

Это было полезно?

Решение

Нет, это нельзя сделать напрямую.

Вы можете определить интерфейс, содержащий все методы java.lang.String (плюс ваши методы), и реализовать его с помощью динамического прокси-сервера , перенаправляющего на реализацию строки (со всеми отрицательными последствиями динамические прокси ).

Возможно, вам лучше использовать преобразование типов new MyString (string) .reverse () , к сожалению, в Java нет методы расширения C # или Неявные преобразования типов в Scala .

Конечно, существует множество обратных реализаций , например, из Библиотека Apache Commons . Это реализовано в процедурном стиле:

String reversed = StringUtils.reverse(string);

(я думаю, ваш обратный метод должен возвращать MyString, а не String, поэтому вы можете написать: s.reverse (). reverse () ).

Другие советы

Не уверен, что я полностью понимаю вопрос, но, в конечном счете, если вы хотите, чтобы у вашего MyString были все те же методы, что и у String , то на каком-то уровне ваш класс должен также имеют все те же методы, определенные. Вы не можете обойти это.

Вероятно, вы можете придумать изящные способы, чтобы для каждого метода вам не приходилось вводить return text.blah () , что-то более элегантное, чем это; но я никак не могу понять, как можно вообще избежать определения методов в вашем MyString .

Вы не можете сделать это, так как вам нужно написать методы, чтобы предоставить их для использования. Но, например, вы можете использовать Netbeans " Создать делегатов ... " особенность, и вы получаете все методы делегата с несколькими щелчками мыши.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top