Pregunta

¿Es necesario afirmarlo.

Tengo una clase:

public class ComponentFactory {
    private static LibraryFrame libraryFrame;

    public static synchronized LibraryFrame getLibraryFrame() {
        if (libraryFrame == null) {
           libraryFrame = new LibraryFrame();
        }
        return libraryFrame;
    }
}

Ahora es necesario usarlo como:

LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame();
Assert.notNull(libraryFrame);
// other part

Aquí afirmar la clase es org.springframework.util.assert.

Si la afirmación falló, ¿hay de todos modos llamar a System.exit (0) después de que ocurrió la falla?

¿Fue útil?

Solución

El afirmación no es necesario ya que el LibraryFrame La instancia siempre se inicializará en este punto.

Otros consejos

De acuerdo a la documentación para esa clase, realmente está destinado a ser utilizado por un método para validar sus argumentos. (Es decir, está destinado a la aplicación de preacondiciones.) Debe tener pruebas unitarias para ComponentFactory, y deberían afirmar que su estática getLibraryFrame() El método no regresa null, pero no vale la pena afirmar esto en tiempo de ejecución.

Bueno, cuando usa la clase ASSERT de JUNIT, cualquier método allí es todo vacío, pero usa el marco JUnit para decirle si la prueba ha pasado o falló.

Si este es un método para las pruebas unitarias, entonces ha realizado su prueba, pero si esto era un mentor para el tiempo de ejecución, use una condición IF.

Recomiendo usar el Patrón de inicialización a pedido (es decir, perezoso cargando singleton) para tu singleton. En ese patrón, si la construcción de la instancia falla, obtendrá una excepción, de lo contrario obtendrá el objeto.

Esto mejora su solución de dos maneras: no tiene la sobrecarga de la sincronización y no tiene la sobrecarga de la Assert. Ambos métodos lanzan una excepción si no se crea el objeto Singleton; en su código obtendrá un IllegalArgumentException de la afirmación.

Usando init-on-demand, su código sería:

public class ComponentFactory 
{
  private ComponentFactory() 
  {
  }

  private static class LazyHolder 
  {
    public static final LibraryFrame INSTANCE = new LibraryFrame();
  }

  public static LibraryFrame getLibraryFrame() 
  {
    return LazyHolder.INSTANCE;
  }
}

Para usarlo aún sería:

LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame();

... excepto que ya no necesitas ni el Assert ni el Synchronized.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top