在Java中将参数传递给静态构造函数?

在Java中将参数传递给静态构造函数?,java,static,constructor,static-constructor,Java,Static,Constructor,Static Constructor,我试图用一个参数初始化一个静态类,然后在该类中运行更多的静态代码。 我知道static块,但它似乎不能接受任何参数。 有没有办法将参数传递给静态构造函数? 如果不是,建议使用参数初始化静态类的技术是什么 编辑: 据我所知,静态类是一个无法实例化的类(在c语言中,它们被称为静态类,如果Java对它们有不同的术语,很抱歉没有意识到),它是通过类名而不是对象名访问的 我试图实现的(非常简单的)是一个类,它接收字典作为字符串,解析它,并让方法像GetRandomEntry那样操作它 下面是我的代码的详细

我试图用一个参数初始化一个静态类,然后在该类中运行更多的静态代码。
我知道
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    
    }  
//...   
公共类问题回答{
私有静态映射easyDefinitions=newhashmap();
//...  
静止的
{  
//需要在这里接收和解析字典
}  
//...   
获取代码片段的相关部分绝非易事,希望我的选择是明智的(:
另一个可能相关的细节——我通常是一名c#程序员,最近才开始学习Java


谢谢。

Java没有静态构造函数。它只有静态初始值设定项,静态初始值设定项不接受任何参数。它在类首次加载时执行,您自己无法调用它


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

您应该使用静态限定符提及成员类,否则就没有静态类 您可以在此上下文中找到使用“static”一词的解释

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

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


希望这对您有所帮助

您可以拥有一个静态方法
公共静态无效设置(Arg1 Arg1,Arg2 Arg2…
),它可以设置所有
静态
字段,并在程序启动时调用它


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

无法将参数直接传递给静态初始化()


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

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

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();
    }
}

您可以使用一个枚举来初始化一个带有如下字符串参数的单例

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(","));
        }
    }
}
import java.util.*;
类数据{
静态映射easyDefinitions=newhashmap();
}
公共枚举问题
{
存储库(“主要=红色、绿色、蓝色;次要=青色、黄色、洋红”);
问题假设(字符串字典){
String[]rules=dictionary.split(“;”);
for(字符串规则:规则){
String[]keyValuePair=rule.split(“=”,2);
Data.easyDefinitions.put(keyValuePair[0],keyValuePair[1]。拆分(“,”);
}
}
}

这是一个错误的方向。有什么特别的原因不能在非静态类中使用普通构造函数吗?在您的理解中,
静态类是什么?代码示例会让人们更好地理解您的问题和上下文。感谢您的评论,editedA维护状态的静态类就像一个单例,这对我来说是全局变量的委婉说法。你应该有一个实例化和维护它的对象,而不是创建一个任何人都可以访问的对象。你的意思是,没有静态修饰符的类和也没有静态修饰符的构造函数在Java中默认都是静态的?(编辑了问题btw,让它更清楚)所以我将有一个类来保存参数?这听起来很聪明,但有点尴尬。另一方面,如果这是唯一的方法….(?)…更重要的是-是否保证ClassToInitialize的静态块将在SetParameter之后运行?这并不意味着只需要保留一个对象来保存参数。这就像,您可以直接调用
static
方法来传递值,几乎与传递参数相同。此外,还可以创建一个Object在静态块中,并根据需要获取参数值。这取决于您的使用和设计。似乎更容易创建一个
static init
方法,而不是在需要时调用额外的类。即使使用有状态单例是一种糟糕的设计。但如何确保该方法在其他静态块之前运行代码?很抱歉延迟,但请参阅我的编辑。谢谢(:@ORenA:您可以添加一个privage标志,它将在静态块中初始化为
false
,并在
setUp()时设置为
true
已激活。每个方法都必须检查标志,如果它为false,则抛出一个
非法状态异常
。我同意此解决方案不是最好的解决方案,只是对如何使用参数初始化的粗略思考。。。