让用户实现静态方法

时间:2016-03-26 02:46:31

标签: java android-fragments module static

我刚刚创建了一个模块(在Android应用程序中),我希望将其作为库共享,因为没有人可用。

要使其工作,用户需要提供一个包含2个静态方法的类:

  • 一个是static Fragment newInstance(arg1, arg2),我必须设置参数的数量和类型,
  • ,第二个是static MyModel getModel(),我在片段中调用。

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

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

newInstance(mParent, position)方法按模式是静态的,getModel()在片段内调用,因此它必须是静态的,因为我的模型绝对不可分割。

但是由于静态方法既不是抽象的也不是接口,我如何让用户实现这些方法呢?

编辑:你可以在界面中放置一个静态方法,但你必须定义它,我希望我的用户覆盖它。

1 个答案:

答案 0 :(得分: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并实现这两个类的类。如果他不隐藏这些类,它会抛出一个简洁的异常,快速查看javadoc将告诉他该怎么做。