让用户实现一个静态方法



我刚刚创建了一个模块(在android应用程序中),由于没有可用的模块,我想将其作为库共享。

为了使其工作,用户需要提供一个具有2个静态方法的类:

  • 一个是static Fragment newInstance(arg1, arg2),我必须设置参数的数量和类型
  • 第二个是CCD_ 2,我在片段内部调用它

当用户实例化模块的主类时,他提供一个类mFragmentClass作为参数,该类将被传递。然后我使用反射来调用静态方法:

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

newInstance(mParent, position)方法按模式是静态的,而getModel()是在Fragment内部调用的,所以它必须是静态的——因为我的模型是绝对不可分割的。

但是,既然静态方法既不能是抽象的,也不能在接口中,我该如何让用户实现这些方法?

EDIT:你可以在接口中放入一个静态方法,但你必须定义它,我希望我的用户覆盖它。

我最终使用了一个抽象类和一些Exceptions。

不是最干净的解决方案,但它有效,我认为用户不会迷路。

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并实现这两个类的类。如果他不隐藏这些类,就会抛出一个整洁的Exception,快速查看javadoc就会告诉他该怎么做

最新更新