0

私はAndroidアプリを構築しています。これで、API #1 のソース コードができました。これを API #2 に適合させる必要があります。次に、API #1 と API #2 の両方のバージョンを別のパッケージで公開します。両方のバージョンが世界中で使用できるため、values-en のようなものは使用できません。また、ユーザーに選択肢がない場合もあります。

新しいバージョンは同じ UI と DB ロジックを使用するため (また、コードに誤りがあるため)、コードを分離したくありません。c または c++ でコーディングしている場合は、#ifdef と Makefile を使用する必要があります。ただし、私はJavaにいます。実行時にパッケージ名を決定することで、API に依存するコードを実行することは可能ですが、やや奇妙です。

注釈を使用できると思います。私が期待するものは次のとおりです。

package foo.app;
public class API {
    public boolean prepare() { ... }
    @TargetPlatform(1)
    public void open() { ... }
    @TargetPlatform(2)
    public void open() { ... }
}

そのうちの 1 つだけを使用します。また、これは良いです:

package foo.app;
public class R {
    @TargetPlatform(1) com.example.foo.app.R R;
    @TargetPlatform(2) net.example.foo.app.R R;
}

注釈を定義するだけで簡単です。私が知らないのは、未使用の重複をビルドまたは実行などから除外するにはどうすればよいですか? このように仕事ができるなら、私は何でもできます。

4

1 に答える 1

0

そのために注釈を使用することはできません。

実装固有のクラスをインターフェイスの背後に隠す方がよいでしょう。

public interface Api {
  boolean prepare();
  void open();
}

インスタンスを作成するにApiは、ファクトリ クラスを使用します。

public class ApiFactory {
  public static Api createApi() {
    if(isTargetPlatform1()) 
      return new com.example.foo.app.Api();
    else
      return new net.example.foo.app.Api();
  }

  private boolean isTargetPlatform1() {
    // determine the current platform, e.g. by reading a configuration file
  }
}

他のすべての場所では、ApiインターフェイスとApiFactoryクラスのみを参照します。そのように使用します:

Api api = ApiFactory.createApi();
api.open();
// ...

より高度なソリューションは、依存性注入を使用することです。

于 2013-08-06T17:06:51.627 に答える