2016-03-26 2 views
0

(アンドロイドアプリで)モジュールを作成したばかりで、誰も利用できないのでライブラリとして共有したいと考えています。それを動作させるためユーザーに静的メソッドを実装させる

、ユーザは2つの静的メソッドを持つクラスを提供する必要がある:

  • 一つstatic Fragment newInstance(arg1, arg2)であり、そしてIは、引数の数とタイプを設定する必要があり、
  • 及び第二であります私がフラグメント内で呼び出すstatic MyModel getModel()

ユーザーがモジュールのメインクラスをインスタンス化すると、ユーザーは引き渡されるクラスmFragmentClassを引数として指定します。私は、静的メソッドを呼び出すためにリフレクションを使用します。

Method m = mFragmentClass.getDeclaredMethod("newInstance", int.class, int.class); 
return (Fragment) m.invoke(null, mParent, position); 

newInstance(mParent, position)方法は、パターンによる静的であり、そしてそれは私のモデルは絶対にparcelableではないので、静的である必要がありますので、getModel()は、断片内と呼ばれています。

しかし、静的メソッドは抽象的でもインタフェースでもないので、ユーザーにこれらのメソッドを実装させるにはどうすればよいですか?

EDIT:インターフェイスに静的メソッドを置くことはできますが、定義する必要があります。ユーザーがそのメソッドをオーバーライドする必要があります。

+1

申し訳ありませんが、* "それを動作させるには、後でリフレクションを使用して呼び出す2つの静的メソッドをクラスに提供する必要があります。" *彼のライブラリには好きなように聞こえません。 – Tom

+0

はい、もちろんですが、今回はあまり選択肢がありません...後で私はより良いプログラマです。実際、私はまだReadme.mdで説明することができますが、私はそれをきれいにしたいと思います。 –

+2

なぜ静的にする必要がありますか? –

答えて

0

私は最終的にこれを抽象クラスといくつかの例外を使用して取得します。

最もクリーンな解決策ではありませんが、うまくいきますが、ユーザーは迷子にならないと思います。

public abstract class BaseChildFragment extends Fragment { 
    public static Fragment newInstance(int horiz, int vert){ 
     throw new IllegalStateException(
       "\n ------ You have to hide (override) newInstance(int horiz, int vert) in your child class ! ------" 
     );} 

    public static MyModel getModel(){/*idem*/} 
} 

だから私は、静的メソッドをオーバーライドすることはできませんが、彼らは隠すことができ、同じであるが、注釈なしとsuperへの可能性のコールなしということを学びました。

私のライブラリのjavadocは、ユーザーに、BaseChildFragmentを拡張し、これらの2つのクラスを実装するクラスを提供するように指示します。彼がこれらのクラスを隠さなければ、きちんとした例外がスローされ、javadocをすばやく見れば何をすべきか教えてくれます。