10

我正在尝试使用参数初始化一个静态类,然后在该类中运行更多静态代码。
我知道这个static块,但它似乎不能接受任何论点。
有没有办法将参数传递给静态构造函数?
如果不是,使用参数初始化静态类的推荐技术是什么?

编辑: 我理解的静态类是一个无法实例化的类(在 c# 中,它们被称为静态类,如果 Java 对它们有不同的术语,很抱歉没有意识到它) - 它是通过它的类名访问的,而不是而不是对象名称。

我想要实现的(非常简化)是一个类,它接收字典作为字符串,解析它,并让方法像GetRandomEntry.

这是我的代码的详细片段:

public class QuestionsRepository {  
private static Map<String,String[]> easyDefinitions = new HashMap<String,String[]>();  

//...  

static 
    {  
    // need to receive and parse dictionary here    
    }  
//...   

获取代码片段的相关部分绝非易事,希望我做出了明智的选择(:
另一个可能相关的细节 - 我通常是 ac# 程序员。最近刚开始学习 Java。

谢谢。

4

6 回答 6

16

我认为您需要根据一些输入来初始化类的静态字段。您可以通过调用另一个类的静态方法来执行以下操作:

class ClassToInitialize {
    static {
        staticField = ParamPassClass.getParameter();
    }

    private static String staticField;

    ClassToInitialize() {
        System.out.println("This is the parameter: " + staticField);
    }

}

class ParamPassClass {
    private static String parameter;
    static String getParameter() {
        return parameter;
    }

    static void setParameter(String parameter) {
        ParamPassClass.parameter = parameter;
    }
}

class Main {
    public static void main(String args[]) {
        ParamPassClass.setParameter("Test param");
        new ClassToInitialize();
    }
}
于 2012-01-29T10:44:20.523 回答
3

Java 没有静态构造函数。它只有静态初始化器,静态初始化器不带任何参数。它在类第一次加载时执行,没有办法自己调用。

您要么需要使用实际对象,要么添加一些配置类的方法(例如,通过静态方法)。

于 2012-01-29T10:33:57.330 回答
1

您应该提到带有静态限定符的成员类,否则没有静态类之类的东西在 这里您可以找到在这种情况下使用“静态”一词的解释。

现在你应该只调用它的构造函数并传递你想要的所有参数,你对静态成员类的唯一限制是它不能引用其外部类的非静态字段,它类似于类上的静态方法不能引用类的非静态字段。

我不明白你为什么在这里提到一个静态初始化块,你能澄清一下吗?还要注意,在java中没有静态构造函数这样的东西......

希望这可以帮助

于 2012-01-29T10:34:28.350 回答
0

您可以有一个静态方法public static void setUp(Arg1 arg1, Arg2 arg2...)来设置所有static字段并在程序启动时调用它。

您必须确保仅调用一次此方法[或仅在您要重置这些字段时]

于 2012-01-29T10:37:43.550 回答
0

无法将参数直接传递给静态初始化(JLS:static initializers)。

如果您可以分享有关您的目标的更多信息,那就太好了。

于 2012-01-29T10:38:11.433 回答
0

您可以使用枚举来初始化带有这样的字符串参数的单例

import java.util.*;
class Data {
    static Map<String,String[]> easyDefinitions = new HashMap<String,String[]>();  
}
public enum QuestionsRepository
{
    repository("primary=red,green,blue;secondary=cyan,yellow,magenta"); 
    QuestionsRepository(String dictionary) {
        String[] rules = dictionary.split(";");
        for (String rule:rules) {
            String[] keyValuePair = rule.split("=",2);
            Data.easyDefinitions.put(keyValuePair[0],keyValuePair[1].split(","));
        }
    }
}
于 2013-04-05T07:37:37.473 回答