L'inizializzazione pesante dovrebbe essere memorizzata come variabile statica o variabile di istanza?

3

Ho una classe che in realtà non specifica alcun oggetto reale da sola ma è più di una classe di utilità. Ha alcuni dati la cui inizializzazione è costosa. Vedo due opzioni su come memorizzare i dati:

  1. Memorizzalo in una variabile statica (inizializzata in un blocco statico).
    • Pro : posso chiamare i metodi di utilità senza dover creare un istanza di questa classe.
    • Con : viene eseguito il pesante codice di inizializzazione quando la classe è caricata, indipendentemente dal fatto che sia usata o meno.
  2. Memorizzalo in una variabile di istanza (inizializzata nel costruttore) :
    • Pro : la pesante inizializzazione viene eseguita solo se la classe viene utilizzata.
    • Con : In questo caso dovrò creare un oggetto della classe e quindi chiamare i metodi di utilità attraverso questo oggetto. Dovrò anche evitare di creare più oggetti della classe di utilità.

Quale di questi due approcci è migliore?

    
posta navari 05.06.2015 - 03:06
fonte

2 risposte

4

Se stai memorizzando dati di qualsiasi tipo nella classe, specialmente se si tratta di una voce di dati costosa, dovresti archiviarla come variabile di istanza.

Ecco perché: devi gestire la durata delle tue classi che memorizzano i dati. Quando l'oggetto esce dall'ambito, la memoria viene automaticamente ripulita dal garbage collector, inclusa la variabile di istanza.

Se la memoria serve, è ancora possibile chiamare metodi di utilità statica sulla classe; dovrai solo trasferire i tuoi dati costosi nel metodo di utilità, proprio come faresti con qualsiasi metodo di utilità statica. In generale, eviterei lo stato statico a meno che tu non abbia una buona ragione per averne bisogno.

    
risposta data 05.06.2015 - 07:08
fonte
1

Ci sono altre opzioni. È possibile utilizzare un Singleton in cui si inizializza l'istanza statica solo se si chiama getInstance ().

MathUtils.java

public class MathUtils {

    private static MathUtils mathUtils;

    private MathUtils() {
        //initialization logic here
    }

    public static MathUtils getInstance() {
        if (mathUtils == null ) {
            mathUtils = new MathUtils();
        }
        return mathUtils;
    }

    public int add(int a, int b) {
        return a + b;
    }
}

Main.java

public class Main {

    public static void main(final String[] args) {
        MathUtils mathUtils = MathUtils.getInstance();
        int addition = mathUtils.add(1, 3);
        System.out.println(addition);
    }
}
    
risposta data 01.09.2015 - 23:20
fonte

Leggi altre domande sui tag