래퍼 클래스의 내부 필드로 메소드 호출을 리디렉션하기위한 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의 암시 적 유형 변환.

물론 충분합니다 역 구현, 예를 들어 아파치 커먼즈 라이브러리. 절차 적 스타일로 구현됩니다.

String reversed = StringUtils.reverse(string);

(귀하의 역 메소드는 문자열이 아닌 MyString을 반환해야한다고 생각합니다. s.reverse().reverse()).

다른 팁

내가 질문을 완전히 이해하는지 확실하지 않지만 궁극적으로 당신이 원한다면 MyString 동일한 방법과 동일한 방법을 갖습니다 String, 그러면 어느 수준에서 당신의 클래스는 동일한 방법을 모두 정의해야합니다. 당신은 정말로 이것을 돌아 다닐 수 없습니다.

아마도 모든 방법에 대해 입력 할 필요가 없도록 깔끔한 방법을 생각 해낼 수 있습니다. return text.blah(), 그보다 더 우아한 것; 그러나 나는 당신이 당신의 메소드 정의를 피할 수있는 방법을 보지 못합니다. MyString 조금도.

사용하기 위해 노출하려면 방법을 작성해야 하므로이 작업을 수행 할 수 없습니다. 그러나 예를 들어 NetBeans의 "Create Delegates ..."기능을 사용할 수 있으며 일부 마우스 클릭으로 모든 대의원 메소드를 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top