Java - 从包含该库的项目中获取库项目的信息

时间:2014-02-11 13:19:39

标签: java android static parent-child abstract-class

我正在开发一个库,需要一些包含该库的项目的配置信息。我在想的是在我的库中使用一些抽象方法并强制应用程序来实现这些方法。 我在寻找的是:

  1. 库中的A类,有一些静态抽象方法,比方说 有一个名为getURL()的方法;
  2. B类实现这些静态 实际应用中的方法和实现方法getURL()来自 A级。
  3. 在我的库中,我调用了A.getURL(),它应该调用方法     来自B类的实现,它扩展了A类并且应该返回我的URL。
  4. 但是抽象方法在Java中不能是静态的。是否有一些解决方法来实现相同的功能。

3 个答案:

答案 0 :(得分:1)

静态抽象方法毫无意义,因为抽象方法应该由扩展类(它是OO的一部分)实现,而static表示非实例方法(不是OO)。

但我最近在J2EE项目中遇到了类似的问题,其中库需要一些特定的配置,具体取决于使用它的项目。

我们决定做的是在项目中有一个具有特定名称的配置文件,库应该在加载后立即读取。如果找不到文件和/或所需的配置,则抛出异常(您可以创建自己的异常)。

我认为这样你可以将库的实现与使用它的项目分离。

答案 1 :(得分:1)

public abstract class A {

    protected static A INSTANCE;

    public static String getURL() {
        return INSTANCE.getURL();
    }

    protected abstract String getURL0();
}

class B extends A {

    static {
        INSTANCE = new B();
    }

    @Override
    protected String getURL0() {
        return "application-specific url";
    }
}

答案 2 :(得分:1)

根据您对问题的回答,我建议如下:

为类检索如下属性的类定义接口:

interface LibaryDetails {

    URL getURL();

    String getName();
}

然后创建某种类型的Factory方法,使您的库运行并执行它。将您的代码重构为主要代码,以便从此处访问它。让此方法将接口作为参数:

public class LibraryFactory{
    public static void startLibrary(LibaryDetails details){
        URL url = details.getURL();
        String name = details.getName();
        // start Library things
    }
}

现在您的库只需要公开界面和静态工厂。您的应用程序只需将LibraryDetails接口的实现传递给工厂方法,您的库就可以访问这些信息。