我正在尝试使用参数初始化静态类,然后在该类中运行更多静态代码。
我知道static
块,但它似乎不能接受任何争论
有没有办法将参数传递给静态构造函数?
如果没有,使用参数初始化Static类的推荐技术是什么?
修改 我理解的一个静态类是一个无法实例化的类(在c#中它们被称为静态类,如果Java对它们有不同的术语,很抱歉没有意识到它) - 它是通过它的类名来访问的,而不是对象名称。
我想要实现的(非常简化)是一个类,它接收字典作为String,解析它,并且方法像GetRandomEntry
一样操纵它。
以下是我的代码的详细摘录:
public class QuestionsRepository {
private static Map<String,String[]> easyDefinitions = new HashMap<String,String[]>();
//...
static
{
// need to receive and parse dictionary here
}
//...
获取代码片段的相关部分绝非易事,希望我明智地选择(: 另一个可能相关的细节 - 我通常是一个c#程序员。刚刚开始学习Java。
感谢。
答案 0 :(得分:13)
我认为你需要根据一些输入初始化类的静态字段。您可以通过调用另一个类的静态方法以下列方式执行此操作:
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();
}
}
答案 1 :(得分:2)
Java没有静态构造函数。它只有静态初始化器,静态初始化器不带任何参数。它是在第一次加载类时执行的,并且无法自己调用它。
您需要使用实际对象,或添加一些配置类的方法(例如,通过静态方法)。
答案 2 :(得分:1)
你应该提到带有静态限定符的成员类,否则就没有静态类这样的东西 Here您可以在此上下文中找到使用“静态”一词的解释。
现在你应该调用它的构造函数并传递你想要的所有参数, 对静态成员类的唯一限制是它不能引用其外部类的非静态字段,它类似于类上的静态方法,它们不能引用类的非静态字段。
我不明白为什么你在这里提到静态初始化块,请你澄清一下? 还要注意,在java中没有静态构造函数......
希望这有帮助
答案 3 :(得分:0)
您可以使用静态方法public static void setUp(Arg1 arg1, Arg2 arg2...)
设置所有static
字段,并在程序启动时调用它。
您必须确保此方法仅被调用一次[或仅在您想要重置这些字段时]
答案 4 :(得分:0)
无法将参数直接传递给静态初始化(JLS:static initializers)。
如果您可以分享有关目标的更多信息,那就太好了。
答案 5 :(得分: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(","));
}
}
}