Передать аргумент статическому конструктору в Java? - PullRequest
8 голосов
/ 29 января 2012

Я пытаюсь инициализировать статический класс с помощью аргумента, а затем запустить еще немного статического кода в этом классе.
Мне известен блок static, но, похоже, он не может принимать аргументы.
Есть ли способ передать аргументы статическому конструктору?
Если нет, то какой метод рекомендуется инициализировать классом Static с помощью аргумента?

Edit: Насколько я понимаю, статический класс - это класс, который не может быть создан (в 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.

Спасибо.

Ответы [ 6 ]

13 голосов
/ 29 января 2012

Я думаю, вам нужно будет инициализировать статические поля класса в соответствии с некоторыми входными данными. Вы можете сделать это следующим образом, вызвав статический метод другого класса:

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();
    }
}
2 голосов
/ 29 января 2012

Java не имеет статических конструкторов.Он имеет только статические инициализаторы, а статические инициализаторы не принимают никаких аргументов.Он выполняется при первой загрузке класса, и нет способа вызвать его самостоятельно.

Вам нужно либо использовать реальные объекты, либо добавить какой-либо способ настройки класса (например, с помощью статического метода).

1 голос
/ 29 января 2012

вы должны упомянуть класс-член со статическим классификатором, иначе нет такого понятия, как статический класс Здесь вы можете найти объяснение использования слова «статический» в этом контексте.

Теперь вам нужно просто вызвать его конструктор и передать все аргументы, которые вы хотите, единственное ограничение, которое вы имеете для статического члена-класса, заключается в том, что он не может ссылаться на нестатические поля своего внешнего класса, он напоминает статические методы класса, которые не могут ссылаться на нестатические поля класса.

Я не понял, почему вы упоминаете здесь статический блок инициализации, не могли бы вы немного уточнить? Знайте также, что в Java нет такого понятия, как статический конструктор ....

Надеюсь, это поможет

0 голосов
/ 05 апреля 2013

Вы можете использовать enum для инициализации сингтона с строковым параметром, подобным этому

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(","));
        }
    }
}
0 голосов
/ 29 января 2012

Невозможно передать аргументы непосредственно статической инициализации ( JLS: статические инициализаторы ).

Было бы неплохо, если бы вы могли поделиться дополнительной информацией о своих целях.

0 голосов
/ 29 января 2012

У вас может быть статический метод public static void setUp(Arg1 arg1, Arg2 arg2...), который устанавливает все ваши поля static и вызывает его при запуске вашей программы.

Вы должны убедиться, что этот метод будет вызываться только один раз [или только когда вы хотите сбросить эти поля]

...