Java 让用户实现一个静态方法

Java 让用户实现一个静态方法,java,android-fragments,module,static,Java,Android Fragments,Module,Static,我刚刚创建了一个模块(在android应用程序中),我想将其作为库共享,因为没有人可用 要使其工作,用户需要提供一个包含2个静态方法的类: Method m = mFragmentClass.getDeclaredMethod("newInstance", int.class, int.class); return (Fragment) m.invoke(null, mParent, position); 一个是静态片段newInstance(arg1,arg2),我必须设置参数的数量和类型

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

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

Method m = mFragmentClass.getDeclaredMethod("newInstance", int.class, int.class);
return (Fragment) m.invoke(null, mParent, position);
  • 一个是
    静态片段newInstance(arg1,arg2)
    ,我必须设置参数的数量和类型
  • 第二个是
    静态MyModel getModel()
    ,我在片段中调用它
当用户实例化模块的主类时,他将提供一个class
MFFragmentClass
作为参数,该参数将被传递。然后我使用反射调用静态方法:

Method m = mFragmentClass.getDeclaredMethod("newInstance", int.class, int.class);
return (Fragment) m.invoke(null, mParent, position);
newInstance(mParent,position)
方法按模式是静态的,而
getModel()
是在片段内部调用的,因此它必须是静态的,因为我的模型是绝对不可打包的

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


编辑:您可以在接口中放置静态方法,但您必须定义它,我希望我的用户覆盖它。

我最终通过使用抽象类和一些异常来完成此操作

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

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会告诉他该怎么做。

对不起,但是“为了让它工作,用户需要提供一个包含两个静态方法的类,我稍后使用反射调用它们。”听起来不像是一个人希望在他的库中拥有的东西。当然,但这一次我没有太多选择。。。也许以后我会成为一名更好的程序员。实际上,我仍然可以在Readme.md中解释它,但我希望它干净。为什么它应该是静态的?为什么不使用接口?我认为它们非常适合我this@ug_接口中不能有静态方法