6

次のようなexistsクラスにいくつかのメソッドを追加する方法を探しています。

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

Objective Cでは、カテゴリを使用してこれを行うことができます。

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

アンドロイドはそのようなものを持っていますか?または別のハック?


更新:実際、私はこの問題を抱えています:私はjarファイルからのクラス(finalではない)を使用しています(したがって、そのソースコードに触れることができません)。次に、継承を使用せずにこのクラスにメソッド(またはそのようなもの)を追加したいと思います。例えば:

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

私がしたいのは:

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

プロキシパターンも試しましたが、うまくいきましたが、その方法は好きではありません(ラッパークラスが好きなので、 1つのメソッドのみを使用するには、多くのフィールドとメソッドを持つオブジェクトを格納する必要があります)。

 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);

そのクラスにメソッドが 1 つしかない場合は、の代わりにそれをprint呼び出すことができます。ProviderPrinterProviderUtils

最終的に、何千もの可能性はありません。次のことができます。

  • クラスとサブクラスで必要なメソッドを拡張します=>それは望まないと言いました
  • クラスのソース コードを変更し、jar の独自のバージョンを再コンパイルします。
  • 必要なメソッドを追加するラッパーでクラスをラップします(ProxyProviderの例)
  • 必要なメソッドを静的ユーティリティ クラスに配置します (上記で提案したもの)。
  • 実行時にクラスを変更してメソッドを追加しますが、クラスローダーで遊ぶ必要があるため、これは複雑なパスです。
于 2012-07-30T12:08:08.713 に答える
1

それは不可能ですが、Xtend と呼ばれる Java のような DSL があり、このような拡張メソッドをサポートする Java の強力な代替品として使用できます。

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

免責事項: 私は、xtext と呼ばれる xtend を作成するために使用されたコア テクノロジの熱心なユーザーにすぎません。Android プロジェクトで xtend を使用することを検討しました

于 2012-07-26T07:04:19.870 に答える
0

Java では、通常の継承を使用してクラスを拡張できます finalStringis ですfinal。文字列は不変であるため、サブクラス化に対して意図的に保護されています。

また、サブクラス化によって動作を追加することは、多くの場合、悪い習慣と見なされます。カップリングは単純に強すぎて、これから作成するオブジェクトのインスタンスに固執します。経験則は、「継承よりも合成を優先する」です。

そうは言っても、あなたの特別な問題を解決するための多くのアプローチ/パターンがあります。Decoratorは、あなたが探しているパターンかもしれません。

質問を更新するか、より詳しい情報を記載した新しい質問を投稿してください。

于 2012-07-26T06:52:21.937 に答える
0

問題のクラスを拡張して、メソッドを追加してみてください。それができない場合(言われたように、Stringはfinalです)、必要なメソッドと拡張したいオブジェクトを使用して、その周りにラッパーを記述します。

お気に入り

 public class MyString
 {
    private String internal;

    //your methods
 }

より良い答えを出せるように、問題をさらに詳しく説明してください。問題の実際のオブジェクトは何か、あなたが本当にやりたいことは何か、それを開示できれば.

于 2012-07-29T04:37:51.337 に答える