是否有一个等价的super用于将方法调用重定向到包装类中的内部字段

时间:2009-10-21 20:08:55

标签: java proxy jvm

让我们说我想创建一个类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();
}

有没有办法可以将方法调用重定向到成员字段而无需实际编写包装器实现?类似于超级的东西?

3 个答案:

答案 0 :(得分:2)

不,这不能直接完成。

您可以定义一个包含所有java.lang.String方法(以及您的方法)的接口,并使用动态代理重定向到字符串实现来实现它(具有{{3的所有负面影响) }})。

对于类型转换 new MyString(string).reverse(),您可能更好,但遗憾的是Java没有dynamic proxiesC#'s extension methods

当然有很多反向实施,例如来自Scala's implicit type conversions。它以程序风格实现:

String reversed = StringUtils.reverse(string);

(我认为你的反向方法应该返回MyString而不是String,所以你可以写:s.reverse().reverse())。

答案 1 :(得分:1)

不确定我是否完全理解这个问题,但最终,如果您希望MyString拥有与String相同的所有方法,那么在某种程度上,您的班级也必须拥有所有相同的内容方法定义。你无法真正解决这个问题。

你可以想出一些简洁的方法,这样你就不需要输入return text.blah()的每一种方法,比这更优雅;但是我没有看到任何方法可以避免在MyString中使用方法定义。

答案 2 :(得分:1)

您无法执行此操作,因为您必须编写方法以公开它们以供使用。但是,例如,您可以使用Netbeans的“创建代理...”功能,只需点击一下鼠标即可获得所有委托方法。