Tengo una clase como:

public class SomeClassImpl implements SomeClass {
   private static final SomeLib someLib = new SomeLib();
}

Yo no puedo hacer esto porque SomeLib lanza una UnknownHostException.

Sé que podría mover la creación de instancias para el constructor, pero hay una manera para mí para hacerlo de la manera que yo lo tengo arriba de alguna manera? De que manera puedo mantener el var marcado como final.

He tratado de buscar la forma de lanzar excepciones en el nivel de clase, pero no puede encontrar nada en ella.

InformationsquelleAutor Blankman | 2011-12-03

5 Comentarios

  1. 44

    Puede utilizar inicializador estático:

    public class SomeClassImpl implements SomeClass {
       private static final SomeLib someLib;
       static {
         SomeLib tmp = null;
         try {
           tmp = new SomeLib();
         } catch (UnknownHostException uhe) {
           //Handle exception.
         }
         someLib = tmp;
       }
    }

    Tenga en cuenta que tenemos que usar una variable temporal para evitar la «variable someLib no podría haber sido inicializado» error y a lidiar con el hecho de que sólo podemos asignar someLib una vez, debido a que es final.

    Sin embargo, la necesidad de añadir la compleja lógica de inicialización y manejo de excepciones a inicializador estático es a menudo un signo de una manera más fundamental problema de diseño. Usted escribió en la sección de comentarios de que esta es una conexión de base de datos a la piscina de la clase. En lugar de usar static final de considerar lo que es una variable de instancia. A continuación, puede hacer la inicialización de un constructor, o mejor aún en un estático método de fábrica.

    • Mi respuesta exactamente, pero el tuyo es con el código y fue publicado segundos antes que la mía. 1+ up-voto.
    • pero esta biblioteca es en realidad un grupo de conexión a una base de datos, estoy cansado de la creación de una variable temporal en caso de que crea 2 instancias de este grupo?
    • por cierto, ¿cómo puedo obligar a la persona que llama para la captura de la excepción a la hora de crear este SomeClassImpl clase? Yo no puedo entender cómo a lanzar en el nivel de clase.
    • En Java, todos los no-variables primitivas son las referencias, por lo que sólo hay un único SomeLib ejemplo aquí con tanto tmp y someLib refiriéndose a esa instancia.
    • ¿Qué entiende usted por «la creación de la clase»? Instatiating o de carga? Como para la creación de instancias puede obligar a su cliente para manejar la excepción al declarar que el constructor lanza una excepción comprobada. Como para la carga: si usted no puede manejar su excepción en el inicializador estático, usted probablemente no debería dejar de ser lanzado por no hacer el campo de la estática.
  2. 4

    Usted podría utilizar un inicializador estático:

    private static final SomeLib SOME_LIB; //respect naming conventions
    
    static {
        try {
            SOME_LIB = new SomeLib();
        }
        catch (UnknownHostException e) {
            throw new RuntimeException("Class initialization failed due to UnknownHostException", e);
        }
    }

    Nota de que la clase no será capaz de inicializar si lo haces así. Tal vez debería intentar inicializar el lib perezosamente, cuando sea necesario. Ejemplo de inicialización de clase excepciones son difíciles de diagnosticar, porque se están transformando en ClassNotFoundException o NoClassDefFoundError (no recuerdo cual)

    • Esto podría resultar en la estrellarse con la aplicación!
    • Sí, prefiero dejar de funcionar inmediatamente en lugar de esperar para un NullPointerException a suceder. Si la aplicación no debe bloquearse, sería la copa de inicializar el campo perezosamente, como escribí en mi respuesta.
    • No me malinterpreten, estoy de acuerdo con usted, pero eso es exactamente lo que él no quiere… Si usted me pregunta utilizando un último campo estático como este, que se lanza una excepción en el constructor, es la mala arquitectura, no debe ser implementado de esta manera, salvo muy raras razones…
  3. 2

    Incluso un poco más elegante que la solución de Adam Zalcman:

    public class SomeClassImpl implements SomeClass {
       private static final SomeLib someLib = initSomeLib();
    
       private static SomeLib initSomeLib() {
         SomeLib someLib = null;
         try {
           someLib = new SomeLib();
         } catch (UnknownHostException uhe) {
           //Handle exception.
         }
         return someLib;
       }
    
    }
  4. 0

    Si inicialización de una variable es probable que falle, entonces es probable que sea un mal candidato para ser estático.

    De la estática son buenas para [eficaz] immutables, (con cuidado) cachés de immutables y poco más.

    • entonces, ¿qué estás sugiriendo que debo hacer? Este es un mongodb clase (Mongo), que es un grupo de conexión a la db.
  5. 0

    Este ejemplo de código se da una idea sobre la inicialización de múltiples varibales con cabo utilizando el método estático:

    public class SomeClass implements SomeOtherClass{
    
    private String string1= getValues("/var/log/log1.txt");
    private String component = getValues("/var/log/log2.txt");
    
    private String getValues(String file) {
            try {
              return  new Scanner(new File(file)).next();
            }catch(FileNotFoundException ioe){
                System.out.println("File not found :: " +ioe);
            }
            return null;
        }

Dejar respuesta

Please enter your comment!
Please enter your name here