6

我正在寻找一种将一些方法添加到现有类中的方法,如下所示:

String s = "";
s.doSomething();

在目标 C 中,我可以使用类别来执行此操作。

@interface NSString( Stuff)
-(void)doSomething();
@end

android有这样的东西吗?还是另一个黑客?


更新:实际上,我遇到了这个问题:我使用了 jar 文件中的一个类(不是最终的)(所以,我不能触及它的源代码)。然后我想在不使用继承的情况下将方法(或类似的东西)添加到这个类中。例如:

 public class Provider{
       // many methods and fields go here...
       public String getName(){}
 }

我想做的就是:

 provider.print(); //that call getName() method;

我也尝试了代理模式,它有效,但我不喜欢这种方式(因为它像一个包装类,我必须存储一个具有许多字段和方法的对象才能仅使用一种方法):

 public class ProxyProvider{
       Provider provider;
       public ProxyProvider(Provider provider){
           this.provider = provider;
       }
       public void print(){
           String name = provider.getName();
           //do something
       }
 }

有没有办法解决这个问题?

4

4 回答 4

4

您可以使用静态方法创建实用程序类:

public final class ProviderUtils {

    private ProviderUtils() {} // not instantiable, it is a utility class

    public static void print(Provider provider) {
        String name = provider.getName();
        // print the name
    }
}

在您的代码中,您可以调用它:

Provider p = new Provider(...);
ProviderUtils.print(p);

如果该类只有一个print方法,您可以调用它ProviderPrinter而不是ProviderUtils.

最后,您没有成千上万的可能性-您可以:

  • 在子类中扩展类和你需要的任何方法=>你说你不想要那个
  • 修改类的源代码,重新编译自己版本的jar
  • 将类包装在添加您需要的方法的包装器中(您的 ProxyProvider 示例)
  • 将您需要的方法放在静态实用程序类中(我在上面提出的)
  • 在运行时修改类并添加一个方法,但这是一条复杂的路径,因为您需要使用类加载器。
于 2012-07-30T12:08:08.713 回答
1

然而,这是不可能的,有一个类似于 DSL 的 Java 可用,称为 Xtend,它可以用作 JAVA 的引人注目的替代品,它可能正在寻找支持这样的扩展方法的工作。

http://www.eclipse.org/xtend/

免责声明:我与此无关,我只是用于创建名为 xtext 的 xtend 的核心技术的狂热用户。我考虑过在 Android 项目上使用 xtend

于 2012-07-26T07:04:19.870 回答
0

在 Java 中,可以使用常规继承来扩展一个类,除非它 final. Stringfinal,因为字符串是不可变的,因此有意保护其免受子类化。

此外,在许多情况下,通过子类化添加行为被认为是不好的做法 - 耦合太强了,并且对于您将要创建的对象的实例一直存在。经验法则是“优先组合胜过继承”。

话虽如此,有很多方法/模式可以解决您的特殊问题。装饰器可能是您正在寻找的模式。

请更新您的问题或发布一个包含更多信息的新问题。

于 2012-07-26T06:52:21.937 回答
0

尝试扩展有问题的类并将您的方法添加到其中。如果这不能完成(就像有人说的那样,String 是最终的),那么只需用你想要的方法和你想要扩展的对象在它周围编写一个包装器。

 public class MyString
 {
    private String internal;

    //your methods
 }

尝试进一步阐述您的问题,以便我可以给出更好的答案。就像有问题的真实对象是什么以及你真正想做的事情,如果你可以透露的话。

于 2012-07-29T04:37:51.337 回答