2012-01-29 21 views
7

Estoy tratando de inicializar una clase estática, con un argumento, y luego ejecutar un código estático más en esa clase.
Conozco el bloque static, pero parece que no puede tomar ningún argumento.
¿Hay alguna manera de pasar argumentos a un constructor estático?
En caso negativo, ¿cuál es la técnica recomendada para inicializar una clase estática utilizando un argumento?¿Pasar el argumento a un constructor estático en Java?

Editar: Una clase estática a mi entender es una clase que no se pueden crear instancias (en C# que se llaman clases estáticas, si Java tiene un término diferente para ellos, lo siento por no ser consciente de ello) - se accede a través de su nombre de clase en lugar de un nombre de objeto.

Lo que estoy tratando de lograr (muy simplificado) es una clase que recibe un diccionario como String, lo analiza y tiene métodos para manipularlo como GetRandomEntry.

He aquí un fragmento elaborada de mi código:

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

//... 

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

Tomando las partes pertinentes de un fragmento de código nunca es fácil, espero haber elegido sabiamente (:
Otro detalle que puede ser relevante - Soy AC# programador, por lo general. Acaba de comenzar el aprendizaje de Java últimamente.

Gracias.

+1

Esto va en la dirección incorrecta. ¿Alguna razón en particular por la que no puedes usar un constructor normal en una clase no estática? –

+2

¿Qué es una "clase estática" en su comprensión? –

+0

Una muestra de código ayudará a las personas a comprender mejor su pregunta y contexto. –

Respuesta

12

Creo que tendrías que inicializar los campos estáticos de la clase de acuerdo con alguna entrada. Puede hacerlo de la siguiente manera llamando al método estático de otra clase:

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

Así que tendré una clase solo para sostener el parámetro? Eso suena ingenioso pero un poco incómodo. Por otro lado, si esa es la única manera de hacerlo ... (?) –

+0

... Y lo más importante, ¿se garantiza que el bloque estático en ClassToInitialize se ejecutará después de SetParameter? –

+0

Esto no significa que necesite mantener un Objeto solo para mantener el parámetro. Es como llamar el método 'estático' directamente para pasar el valor, casi lo mismo que pasar el parámetro. Además, es posible crear un un objeto dentro del bloque estático y obtener th e valor del parámetro según sea necesario. Depende de tu uso y diseño. –

2

Java no tiene constructores estáticos. Sólo tiene inicializadores estáticos y inicializadores estáticos no tiene ningún argumento. Se se ejecuta cuando la clase se carga por primera vez, y no hay forma de llamarlo usted mismo.

Debe utilizar objetos reales o agregar alguna forma de configurar la clase (por ejemplo, a través de un método estático).

1

debe mencionar la clase de miembro con un calificador estático, de lo contrario no existe una clase estática Here puede encontrar la explicación de usar la palabra 'estático' en este contexto.

Ahora debe simplemente llamar a su constructor y pasar todos los argumentos que desee, la única restricción que tiene en una clase de miembro estática es que no puede referir los campos no estáticos de su clase externa, se asemeja unos métodos estáticos en la clase que no pueden referir los campos no estáticos de la clase.

No entendí por qué mencionas aquí un bloque de inicialización estática, ¿podrías aclarar un poco? Tenga en cuenta también que en java no hay tal cosa como constructor estático ....

espero que esto ayude

+0

, quiere decir que una clase sin un modificador estático y un constructor sin un modificador estático, ambos están estáticos en Java de forma predeterminada. (corrigió la pregunta por cierto, para que quede más claro) –

0

Puede tener un método estático public static void setUp(Arg1 arg1, Arg2 arg2...) que establece todos los campos static e invocar cuando su el programa comienza

Usted tiene que asegurarse de que este método será llamado una sola vez [o sólo cuando se desea restablecer estos campos]

+0

¿Pero cómo me aseguraré de que el método se ejecute ANTES de mi otro código estático? Perdón por la demora, pero consulte mi edición. Gracias (: –

+0

@ORenA: puede agregar un indicador de privacidad, que se inicializará a 'falso' en un bloque estático, y se establecerá en' true' cuando 'setUp()' esté activado. Todos los métodos deberán verificar la bandera y lanzar una 'IllegalStateException' si es falsa. Estoy de acuerdo con que esta solución no es la mejor, es solo una forma aproximada de cómo puedes inicializar con parámetros ... – amit

0

No es posible pasar directamente a los argumentos que se inicie la estáticos (JLS:static initializers).

Sería bueno si pudiera compartir más información acerca de sus objetivos.

0

Se podría utilizar una enumeración para inicializar un conjunto unitario con un parámetro de cadena como esta

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