簡體   English   中英

將參數傳遞給Java中的靜態構造函數?

[英]Pass argument to a static constructor in Java?

我正在嘗試使用參數初始化靜態類,然后在該類中運行更多靜態代碼。
我知道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    
    }  
//...   

獲取代碼片段的相關部分絕非易事,希望我明智地選擇(:
另一個可能相關的細節 - 通常是我的#程序員。 剛開始學習Java。

謝謝。

我認為你需要根據一些輸入初始化類的靜態字段。 您可以通過調用另一個類的靜態方法以下列方式執行此操作:

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

Java沒有靜態構造函數。 它只有靜態初始化器,靜態初始化器不帶任何參數。 它是在第一次加載類時執行的,並且無法自己調用它。

您需要使用實際對象,或者添加一些配置類的方法(例如,通過靜態方法)。

你應該提到帶有靜態限定符的成員類,否則就沒有靜態類這樣的東西在這里你可以找到在這個上下文中使用'static'這個詞的解釋。

現在你應該只調用它的構造函數並傳遞你想要的所有參數,你對靜態成員類的唯一限制是它不能引用它的外部類的非靜態字段,它類似於類上的靜態方法不能引用類的非靜態字段。

我不明白為什么你在這里提到一個靜態初始化塊,請你澄清一下? 還要注意,在java中沒有靜態構造函數這樣的東西....

希望這可以幫助

您可以使用枚舉來初始化具有這樣的字符串參數的單例

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

你可以有一個靜態方法public static void setUp(Arg1 arg1, Arg2 arg2...) ,它設置你所有的static字段,並在你的程序啟動時調用它。

您必須確保只調用此方法一次[或僅在您要重置這些字段時]

不能將參數直接傳遞給靜態初始化( JLS:靜態初始化器 )。

如果您可以分享有關您的目標的更多信息,那將是很好的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM