我刚刚创建了一个模块(在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()
在片段内调用,因此它必须是静态的,因为我的模型绝对不可分割。
但是由于静态方法既不是抽象的也不是接口,我如何让用户实现这些方法呢?
编辑:你可以在界面中放置一个静态方法,但你必须定义它,我希望我的用户覆盖它。
答案 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将告诉他该怎么做。