2012-01-29 19 views
7

Próbuję zainicjować klasę statyczną z argumentem, a następnie uruchomić trochę bardziej statycznego kodu w tej klasie.
Jestem świadomy bloku static, ale wygląda na to, że nie może przyjmować żadnych argumentów.
Czy istnieje sposób przekazywania argumentów do konstruktora statycznego?
Jeśli nie, jaka jest zalecana technika inicjowania klasy statycznej za pomocą argumentu?Przekaż argument do konstruktora statycznego w Javie?

Edit: statyczna klasa w moim rozumieniu jest to klasa, która nie może być instancja (w języku C# są one nazywane klas statycznych, jeśli Java ma inny termin dla nich, przepraszam za nie wiedząc o tym) - Dostęp do niego odbywa się poprzez jego nazwę klasy, a nie nazwę obiektu.

Co staram się osiągnąć (bardzo uproszczone) to klasa, która odbiera słownik jako ciąg, analizuje go i ma metody manipulowania nim, takie jak GetRandomEntry.

Oto rozbudowany fragment mojego kodu:

public class QuestionsRepository { 
private static Map<String,String[]> easyDefinitions = new HashMap<String,String[]>(); 

//... 

static  
    { 
    // need to receive and parse dictionary here  
    } 
//... 

Biorąc odpowiednich części fragmentu kodu nigdy nie jest łatwe, nadzieję, że wybrali mądrze (:
Kolejny szczegół, który może mieć znaczenie - jestem aC# programista, zwykle. Właśnie rozpoczął naukę Java ostatnio.

Dzięki.

+1

ten zmierza w zły kierunek. Jakiś szczególny powód, dla którego nie możesz po prostu użyć normalnego konstruktora w klasie niestatycznej? –

+2

Co to jest "klasa statyczna" w twoim rozumieniu? –

+0

Próba kodu pozwoli lepiej zrozumieć twoje pytanie i kontekst. –

Odpowiedz

12

Myślę, że trzeba zainicjować statyczne pola klasy zgodnie z niektórymi danymi wejściowymi. Można to zrobić w następujący sposób poprzez wywołanie statycznej metody z innej klasy:

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

Więc będę miał klasę tylko do trzymania Parametr? Brzmi to sprytnie, ale nieco niezręcznie, z drugiej strony, jeśli to jedyny sposób, aby przejść .. (?) –

+0

..A co ważniejsze - czy jest zagwarantowane, że blok statyczny w ClassToInitialize będzie działać po SetParameter? –

+0

Nie oznacza to, że musisz utrzymywać obiekt tylko po to, aby przytrzymać parametr.To jest tak, można wywołać metodę 'statyczną' bezpośrednio do przekazania wartości, prawie tak samo jak parametr przekazujący. Obiekt wewnątrz bloku statycznego i uzyskaj e wartość parametru zgodnie z wymaganiami. Zależy od zastosowania i projektu. –

2

Java nie mają konstruktorów statycznych. ma tylko inicjatorów statyczne i inicjatorów statyczne nie podejmować żadnych argumentów. It jest wykonywany, gdy klasa jest załadowana po raz pierwszy, i nie ma sposobu, aby nazwać ją samodzielnie.

Musisz użyć rzeczywistych obiektów lub dodać sposób konfiguracji klasy (np. Metodą statyczną).

1

powinieneś wspomnieć o klasie członkowskiej ze statycznym kwalifikatorem, w przeciwnym razie nie ma czegoś takiego jak statyczna klasa Here możesz znaleźć wyjaśnienie użycia słowa "static" w tym kontekście.

Teraz powinieneś po prostu wywołać jego konstruktor i przekazać wszystkie potrzebne argumenty, jedyne ograniczenie jakie masz na statycznej klasie składowej to to, że nie może odnosić się do niestatycznych pól swojej klasy zewnętrznej, to przypomina statyczne metody na klasie, które nie mogą odwoływać się do niestatycznych pól klasy.

Nie rozumiem, dlaczego wspomniałeś tutaj o bloku inicjalizacji statycznej, czy mógłbyś trochę wyjaśnić? Należy pamiętać również, że w Javie nie ma czegoś takiego jak konstruktor statyczny ....

Nadzieja to pomaga

+0

masz na myśli to, że klasa bez statycznego modyfikatora i konstruktor również bez statycznego modyfikatora są domyślnie zarówno statyczne w Javie? (zredagowałem pytanie btw, aby było jaśniejsze) –

0

Można mieć statyczną metodę public static void setUp(Arg1 arg1, Arg2 arg2...) która tworzy wszystkie pola static i powołać go podczas swojej program się uruchamia.

Musisz upewnić się, ta metoda zostanie wywołana tylko raz [lub tylko wtedy, gdy chcesz przywrócić te pola]

+0

Ale jak mam się upewnić, że ta metoda działa PRZED moim innym statycznym kodem? Przepraszamy za opóźnienie, ale zapoznaj się z moją edycją. Thanks (: –

+0

@ORenA: możesz dodać flagę privage, która zostanie zinicjalizowana do 'false' w bloku statycznym, i zostanie ustawiona na' true', gdy aktywowane jest 'setUp()' .Każda metoda będzie musiała sprawdzić flagę i wyrzuć 'IllegalStateException' jeśli jest fałszywa. Zgadzam się, że to rozwiązanie nie jest najlepsze, jest po prostu nieoszlifowanym narzędziem, które można zainicjować za pomocą parametrów ... – amit

0

Nie jest możliwe aby przekazywać argumenty bezpośrednio do statycznych inicjuje (JLS:static initializers).

Byłoby miło, gdyby można było przekazać więcej informacji o swoich celach.

0

można użyć enum zainicjować singleton z parametrem strun jak ten

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(",")); 
     } 
    } 
} 
Powiązane problemy