Spesso abbiamo tale confusione nella programmazione: alcune funzioni vengono risolte usando singleton, altre con metodi statici, quindi quali sono i principi e gli scenari d'uso dei metodi statici e dei singleton? Chiariamoci la questione oggi.
1. Vediamo prima la differenza tra metodi statici e metodi non statici?
Molti programmatori hanno questa comprensione che i metodi statici si caricano per primi, i metodi non statici si caricano dopo, i metodi statici esisteranno sempre in memoria e i metodi non statici no. Pertanto, si raccomanda di utilizzare un metodo non statico. Prima di tutto, è sbagliato sottolineare che questa comprensione è sbagliata.
Prima di tutto, analizziamo dalla memoria: quando l'applicazione viene inizializzata, il CLR (CLR è il Common Language Runtime) è anche un ambiente di esecuzione simile alla macchina virtuale Java, responsabile della gestione delle risorse (allocazione di memoria e garbage collection, ecc.) e garantisce la necessaria separazione tra l'applicazione e il sistema operativo sottostante. Il CLR ha due nomi di traduzione diversi: Common Language Runtime e Common Language Runtime. Assegna uno spazio di indirizzamento a ciascun processo nello spazio disponibile del processo, che è l'heap gestito. L'heap gestito è suddiviso in più regioni, le più importanti delle quali sono il garbage collection heap (GC Heap) e il loader heap (Loader Heap), che viene utilizzato per memorizzare istanze di oggetti ed è gestito dal GC. Le informazioni più importanti che il Loader Heap memorizza tramite la tabella MethodTable sono le informazioni relative ai metadati, come tipi base, campi statici, interfacce di implementazione e tutti i metodi. Il Loader Heap non accetta il controllo GC, e il suo ciclo di vita va dalla creazione alla distruzione. In altre parole, una volta caricata una classe, sia i metodi statici che quelli non statici di questa classe vengono memorizzati nella tabella MethodTab del Load Heap, senza il controllo GC, e sono tutti residenti in memoria per il primo caricamento.
Qual è la differenza tra un metodo statico e uno non statico? La differenza è che quando si crea un oggetto, il metodo statico ha solo una copia, mentre il metodo non statico copia una copia delle informazioni su questa istanza su GC Heap per ogni nuovo oggetto, e allo stesso tempo metterà il nuovo oggetto nello stack. L'indirizzo a cui punta il puntatore dello stack è l'indirizzo di memoria appena copiato su GC Heap. Pertanto, in termini di velocità di chiamata al metodo, i metodi statici sono più veloci perché i metodi non statici devono essere istanziati e allocare memoria.
Dal punto di vista della storia della programmazione, quasi tutti i metodi della programmazione strutturata iniziale erano metodi statici, e l'introduzione dei metodi di istanza era una questione di programmazione orientata agli oggetti, quindi il metodo di istanza non doveva risolvere il problema dell'efficienza di esecuzione e della memoria. Serve a rendere lo sviluppo più strutturato e orientato agli oggetti.
Dall'analisi sopra citata, si può trarre una conclusione: 1. Il metodo statico e quello non statico distinguono la modalità soluzione. 2. Se ereditarietà, polimorfismo o se un metodo non ha nulla a che fare con l'oggetto della sua classe, dovresti scegliere un metodo statico, come una classe strumento.
2. Qual è la differenza tra modalità singleton e metodo statico?
A volte dobbiamo mantenere un'informazione in ingegneria, come alcuni attributi di configurazione caricati a runtime, che devono esistere per tutta la durata dell'applicazione e sono pubblici, quindi serve una sola copia. Al momento, considereremo l'uso di un metodo singleton o statico per mantenere questi dati, ma al momento questi dati vengono ottenuti in modo orientato agli oggetti, useremo un singleton.
Innanzitutto, i metodi statici sono basati su classi, mentre i singleton sono basati su oggetti. Se il pattern di risoluzione è basato su oggetti, usa un singleton, altrimenti usa un approccio statico. Ad esempio, devi ereditare classi, implementare interfacce, ritardare l'inizializzazione, riscrivere le classi genitori, ecc. per usare singleton, secondo, i metodi statici sono orientati ai processi, e i singleton sono orientati agli oggetti. In terzo luogo, le variabili di attributo statiche non verranno cancellate dal GC, quindi gli oggetti singleton non saranno cancellati dal GC, e gli oggetti generati nei metodi statici saranno rilasciati quando il metodo statico viene eseguito. |