2011-11-22 18 views
6

Tengo una aplicación java que crea dos objetos estáticos en una clase base, estos objetos necesitan referencias en todas las clases del programa.Hacer referencia al objeto estático creado en una clase a lo largo de toda la aplicación

public class Baseclass{ 
    public static ClassA A = new ClassA(); 
    public static ClassB B = new Classb(); 
    ... 
    ... 
    ... 
} 

Estos objetos se mencionan en las otras clases como variables privadas locales.

public class ClassA{ 
    private ClassB b = Baseclass.B; 

Sin embargo, ambos objetos se necesitan mutuamente para funcionar y si crea una nueva instancia de uno de los objetos antes que el otro se crea, la variable local en las clases "superiores" se establece en NULL. ¿Hay algún concepto en Java que haga referencia al objeto real (como un puntero) al objeto como una variable en lugar de hacer una copia del objeto?

+4

Hablar de mal diseño .. – mre

+0

(ObPlead: Por favor, no use estática mutable (anteriormente conocida como globales). Y eso incluye el uso del antipatrón singleton.) –

Respuesta

6

Creo que la respuesta que está buscando es un "patrón singleton". Aquí es donde creas solo una instancia de una clase para usar en otros lugares. Aquí hay un good link to read. Aquí está el wikipedia page on it con algunos ejemplos de Java.

lo que el código podría ser algo como esto:

public class A { 
    private final static A instance = new A(); 

    /* private constructor forces you to use the getInstance() method below */ 
    private A() {} 

    public static A getInstance() { 
     return instance; 
    } 
} 

Entonces dondequiera que usted desee obtener una instancia de A que haría algo como:

public class B { 
    private final A classA = ClassA.getInstance(); 
    ... 
} 

No hay ninguna razón por la A podía tampoco tiene una instancia de B y llama a los métodos de B en sus propios métodos. Lo que no puede hacer con esta dependencia cruzada es llamar a cualquiera de los métodos del otro en el constructor.

En general, por cierto, estos patrones se deben usar con moderación. Una mejor manera de lograr esto es a través de la inyección de dependencia en lugar de referencias globales. La inyección cruzada es posible pero, una vez más, debe usarse con moderación. Una mejor solución sería refactorizar las clases para tener dependencias lineales.

¿Hay algún concepto en Java que haga referencia al objeto real (como un puntero) al objeto como una variable en lugar de hacer una copia del objeto?

Java es paso por valor, pero el valor de cualquier objeto es la referencia al objeto (similar a los punteros en C aunque son no una dirección de memoria). Por lo tanto, si tiene una instancia de A y la asigna a otro campo, ese campo tendrá el mismo valor y hará referencia a la misma instancia de A.

// instantiate a new instance of A 
A a1 = new A(); 
// assign the reference to A to another variable 
a2 = a1; 
// they are equivalent and both reference the same object 
if (a1 == a2) ... 
1

¿Hay algún concepto en Java que haga referencia al objeto real (como un puntero) al objeto como una variable en lugar de hacer una copia del objeto?

En realidad, Java tiene sólo referencias. Una variable no puede contener un objeto, por lo que no se preocupe.

Además, en lugar de hacer

private ClassB b = Baseclass.B; 

le sugeriría considerar hacer una importación estática:

import static some.package.Baseclass.*; 
+0

He editado la publicación original para que la línea 'private classB' sea sintácticamente correcta. Tan pronto como mi edición sea aceptada de todos modos ... –

1

Cuando se hace una referencia en Java en realidad está haciendo una copia de una referencia . No está copiando Baseclass.B en su ejemplo. Está copiando una referencia al Baseclass.B.

En el código de ejemplo que ha proporcionado, b va a ser nulo hasta que se defina Baseclass.B. Si necesita realizar una operación en b, no puede hacerlo en la declaración de ClassA. Debe hacerlo en un método que se llama después de que se haya creado el objeto a.

0

Esta es una aplicación clásica para singleton.

Para cada uno:

  • Hacer el constructor privado.
  • Agregue un miembro estático privado del tipo propio de la clase para contener el singleton .
  • Agregue un método "getThe()" que inicializa el miembro anterior si no está ya configurado.

Ver wikipedia:Singleton pattern.

Haga también el constructor de una construcción B, haciendo un getThe() en ella.

Además, no use campos públicos en Baseclass; en su lugar use métodos public getter. No mantener una variable B por separado; en su lugar, pregúntale al Singleton por eso.

0

¿Hay alguna conceptos en Java que hacen referencia al objeto real (como un puntero) al objeto como una variable en lugar de hacer una copia del objeto?

Al hacer esto:

private ClassB b = Baseclass.B; 

Realmente está Ponting al mismo objeto a que es porque la variable "b" es el nombre de variable de referencia.

Acerca de su pregunta, mi recomendación es hacer algo como esto:

Primera encapsular la referencia:

public class ClassA{ 
    private ClassB b; 

    public void setB(ClassB b) { 
     this.b = b; 
    } 

    public ClassB getB(ClassB b) { 
     return this.b; 
    } 

} 

segundo uso de un bloque estático para init las variables:

public class Baseclass{ 
    public static ClassA A = new ClassA(); 
    public static ClassB B = new Classb(); 
    static { 
     A.setB(B); 
     B.setA(A); 
    } 
} 
Cuestiones relacionadas