将静态方法应用于存储在子类中的数据

时间:2013-01-12 02:31:11

标签: java

我正在创建一个类来访问有关存储在Jar文件中的类库的信息,并运行为每个类库定制的操作。它包含从Jar文件加载本地化字符串等的方法。

public class CodeBundle {
    public static String str(String id) {
        ...
    }

    ...
}

我需要能够知道我正在尝试从哪个库加载信息,所以我希望能够使用代表每个库的子类,例如:

public class JAppFramework extends CodeBundle {
    ...
}

现在,在作为JApp Framework一部分的代码中,我希望能够调用JAppFramework.str("...")从JApp Framework资源包加载字符串。如果我有另一个库,例如TestLibrary,我希望能够调用TestLibrary.str("...")从Test Library的资源包中加载一个字符串。我所做的是在CodeBundle中定义了一个名为getFile()的方法,该方法将返回已加载库的Jar文件。然后str()方法将使用它来加载本地化字符串。

问题在于CodeBundle中的静态方法只能访问存储在CodeBundle类中的数据,而不是其任何子类中的数据。据我所知。

由于各种原因,我无法使用“getClass()。getResource(name)”来加载资源。

有什么办法可以做我想做的事吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用单身人士:

public abstract class CodeBundle { // or even an interface
    public abstract String str(String id);
}

public final class JAppFramework extends CodeBundle {
    private static final CodeBundle INSTANCE = new JAppFramework();

    // private constructor
    private JAppFramework() {
        // whatever
    }

    // get the instance
    public static CodeBundle getInstance() { return INSTANCE; }

    // Implement str() here
}

// Create other singletons as needed

在您的代码中:

CodeBundle bundle = JAppFramework.getInstance();
bundle.str(whatever);

当然,这是一个非常简单的例子。在CodeBundle中放置所需的任何字段/方法/构造函数/构造函数参数 - 由于它是抽象的,因此无法实例化。