Передать аргумент статическому конструктору в Java?

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

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

Спасибо.


person Oren A    schedule 29.01.2012    source источник
comment
Это движется в неправильном направлении. По какой-то конкретной причине вы не можете просто использовать обычный конструктор в нестатическом классе?   -  person Thorbjørn Ravn Andersen    schedule 29.01.2012
comment
Что такое static class в вашем понимании?   -  person James Jithin    schedule 29.01.2012
comment
Образец кода поможет людям лучше понять ваш вопрос и контекст.   -  person Kevin D    schedule 29.01.2012
comment
Спасибо за комментарии, отредактировал   -  person Oren A    schedule 29.01.2012
comment
Статический класс, который поддерживает состояние, подобен синглтону, что для меня является эвфемизмом для глобальной переменной. У вас должен быть объект, который создает и поддерживает его, а не создает объект, доступ к которому может получить любой.   -  person Juan Mendes    schedule 13.06.2012


Ответы (6)


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

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();
    }
}
person James Jithin    schedule 29.01.2012
comment
Итак, у меня будет класс только для хранения параметра? Звучит умно, но немного неловко. С другой стороны, если это единственный путь... (?) - person Oren A; 29.01.2012
comment
..И что еще более важно - гарантировано ли, что статический блок в ClassToInitialize будет работать после SetParameter? - person Oren A; 29.01.2012
comment
Это не означает, что вам нужно хранить объект только для хранения параметра. Это похоже на то, что вы можете напрямую вызвать метод static для передачи значения, почти так же, как при передаче параметра. Кроме того, внутри статического блока можно создать объект и получить требуемое значение параметра. Зависит от вашего использования и дизайна. - person James Jithin; 29.01.2012
comment
Кажется, чище создать метод static init, который вы можете вызывать, когда захотите, вместо дополнительного класса. Несмотря на то, что использование синглтона с отслеживанием состояния — плохой дизайн. - person Juan Mendes; 13.06.2012

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

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

person Mark Rotteveel    schedule 29.01.2012

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

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

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

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

person Mark Bramnik    schedule 29.01.2012
comment
вы имеете в виду, что класс без модификатора static и конструктор также без модификатора static по умолчанию являются статическими в Java? (кстати, отредактировал вопрос, чтобы было понятнее) - person Oren A; 29.01.2012

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

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

person amit    schedule 29.01.2012
comment
Но как мне убедиться, что этот метод запускается ДО моего другого статического кода? Извините за задержку, но, пожалуйста, обратитесь к моему редактированию. Спасибо (: - person Oren A; 29.01.2012
comment
@ORenA: вы можете добавить флаг приватности, который будет инициализирован false в статическом блоке и будет установлен в true при активации setUp(). Каждый метод должен будет проверять флаг и выдавать IllegalStateException, если он неверен. Я согласен, что это решение не самое лучшее, это просто грубая идея о том, как вы можете инициализировать параметры... - person amit; 29.01.2012

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

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

person xea    schedule 29.01.2012

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

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(","));
        }
    }
}
person Ted    schedule 05.04.2013