我刚刚创建了一个模块(在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就会告诉他该怎么做