【问题标题】:Java - get information into library project from project which includes this libraryJava - 从包含该库的项目中获取信息到库项目中
【发布时间】:2014-02-11 13:19:38
【问题描述】:

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

  1. 库中的 A 类具有一些 静态抽象方法,例如 有一个名为 getURL() 的方法;
  2. A 类 B 实现这些静态 实际应用中的方法和实现方法 getURL() from A类。
  3. 在我的库中,我调用了 A.getURL(),它应该调用方法 B 类的实现,它扩展了 A 类,应该返回我的 url。

但是Java中的抽象方法不能是静态的。是否有一些解决方法可以实现相同的功能。

【问题讨论】:

  • 为什么它需要是静态的?如果你的库中有一个非静态类,你可以将你的“配置”作为参数传递给构造函数/工厂方法。
  • 实际上,应用程序不会创建任何类库的任何对象。库有 Main 类,它需要来自应用程序的一些信息才能开始其实际工作。
  • 当应用程序启动时,它只会运行 1 个主要方法。这种方法应该被认为只是程序的“入口点”,它本身不应该做太多的功能性工作。如果您有两个应用程序正在运行,那么它就不再是一个真正的库了。我建议您更改库实现以使用对象。也许您可以提供更多信息来帮助我们改进这些答案。
  • 好吧,让我解释一下。为简单起见,我使用的是主类。其实这是一个安卓项目。库有一个特定的菜单和 Web 服务组件。 lib 完成的所有工作都是动态的。 Lib 需要来自包含它的项目的菜单名称和相应的类名称。但出于安全考虑,它不会向使用它的应用程序披露控制流或其任何类 sn-p。我想在两个应用程序之间添加某种接口来共享配置等。

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


【解决方案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";
    }
}

【讨论】:

  • 在使用 A.getURL() 之前还需要 B 类初始化
  • 如何初始化 B,因为我的库不知道哪个类在应用程序中扩展了 A 类。
  • 好吧,库只知道A类。但是应用程序知道B类。因此在使用静态getURL()方法之前,你应该确保应用程序中B类的初始化。
【解决方案2】:

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

但我最近在一个 J2EE 项目中遇到了类似的问题,其中库需要根据使用它的项目进行一些特定的配置。

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

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

【讨论】:

  • 感谢 Thiago Veronese,我面临同样的情况。配置文件不适合我面临的情况。在某些情况下,应用程序可能需要提供动态信息。
【解决方案3】:

根据您对问题的回答,我会推荐以下内容:

为检索属性的类定义一个接口,如下所示:

interface LibaryDetails {

    URL getURL();

    String getName();
}

然后创建某种类型的工厂方法,使您的库运行并完成它的事情。从 main 中重构您的代码,以便可以从这里访问它。让这个方法将接口作为参数:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2012-05-23
    • 2013-01-08
    • 2015-01-31
    相关资源
    最近更新 更多