static-methods import - Java:quando utilizzare i metodi statici



comandi esempio (17)

Un metodo statico ha due scopi principali:

  1. Per i metodi di utilità o di supporto che non richiedono alcun stato dell'oggetto. Poiché non è necessario accedere alle variabili di istanza, i metodi statici eliminano la necessità per il chiamante di creare un'istanza dell'oggetto solo per chiamare il metodo.
  2. Per lo stato condiviso da tutte le istanze della classe, come un contatore. Tutte le istanze devono condividere lo stesso stato. I metodi che usano semplicemente quello stato dovrebbero essere anche statici.

Mi chiedo quando utilizzare i metodi statici? Diciamo se ho una classe con pochi getter e setter, un metodo o due, e voglio che quei metodi siano invocabili solo su un oggetto istanza della classe. Questo significa che dovrei usare un metodo statico?

per esempio

Obj x = new Obj();
x.someMethod

o

Obj.someMethod

(è questo il modo statico?)

Sono piuttosto confuso!


Definire metodi statici solo nei seguenti scenari:

  1. Se stai scrivendo classi di utilità e non dovrebbero essere modificate.
  2. Se il metodo non sta utilizzando alcuna variabile di istanza.
  3. Se qualsiasi operazione non dipende dalla creazione dell'istanza.
  4. Se esiste un codice che può essere facilmente condiviso da tutti i metodi di istanza, estrailo in un metodo statico.
  5. Se sei sicuro che la definizione del metodo non verrà mai modificata o sovrascritta. Non è possibile sovrascrivere i metodi statici.

Una regola pratica: chiediti "ha senso chiamare questo metodo, anche se nessun Obj è stato ancora costruito?" Se è così, dovrebbe essere decisamente statico.

Quindi in una Car classe potresti avere un metodo double convertMpgToKpl(double mpg) che sarebbe statico, perché si potrebbe voler sapere a cosa converte 35mpg, anche se nessuno ha mai costruito un'automobile. Ma il void setMileage(double mpg) (che definisce l'efficienza di una particolare auto) non può essere statico, poiché è inconcepibile chiamare il metodo prima che qualsiasi auto sia stata costruita.

(A proposito, il contrario non è sempre vero: a volte potresti avere un metodo che coinvolge due oggetti Car , e vuoi comunque che sia statico. Ad esempio Car theMoreEfficientOf( Car c1, Car c2 ) . Anche se questo potrebbe essere convertito in un non versione statica, alcuni sostengono che poiché non c'è una scelta "privilegiata" di cui Car è più importante, non si dovrebbe forzare un chiamante a scegliere una macchina come l'oggetto su cui invocherete il metodo. per una piccola parte di tutti i metodi statici, però.)


I metodi statici sono i metodi in Java che possono essere chiamati senza creare un oggetto di classe. Appartiene alla classe

Usiamo il metodo statico quando non abbiamo bisogno di essere invocati metodo usando l'istanza.


Un metodo static è un tipo di metodo che non necessita di alcun oggetto da inizializzare per essere chiamato. Hai notato che la funzione static viene utilizzata nella funzione main in Java? L'esecuzione del programma inizia da lì senza che venga creato un oggetto.

Considera il seguente esempio:

 class Languages 
 {
     public static void main(String[] args) 
     {
         display();
     }

     static void display() 
     {
         System.out.println("Java is my favorite programming language.");
     }
  }

Utilizzare un metodo statico quando si desidera poter accedere al metodo senza un'istanza della classe.


Se si applica la parola chiave statica con qualsiasi metodo, è noto come metodo statico.

  1. Un metodo statico appartiene alla classe piuttosto che all'oggetto di una classe.
  2. Un metodo statico invocato senza la necessità di creare un'istanza di una classe.
  3. il metodo statico può accedere a membri di dati statici e può modificarne il valore.

// Programma di modifica della proprietà comune di tutti gli oggetti (campo statico).

class Student9{  
 int rollno;  
 String name;  
 static String college = "ITS";  

 static void change(){  
 college = "BBDIT";  
 }  

 Student9(int r, String n){  
 rollno = r;  
 name = n;  
 }  

 void display (){System.out.println(rollno+" "+name+" "+college);}  

public static void main(String args[]){  
Student9.change();  

Student9 s1 = new Student9 (111,"Indian");  
Student9 s2 = new Student9 (222,"American");  
Student9 s3 = new Student9 (333,"China");  

s1.display();  
s2.display();  
s3.display();  
}  }

O / P: 111 BBDIT indiano 222 BBDIT americano 333 China BBDIT


In Eclipse è possibile abilitare un avviso che consente di rilevare potenziali metodi statici. (Sopra la linea evidenziata ce n'è un'altra che ho dimenticato di evidenziare)


In realtà, usiamo proprietà e metodi statici in una classe, quando vogliamo usare parte del nostro programma dovrebbe esistere fino a quando il nostro programma è in esecuzione. E sappiamo che, per manipolare le proprietà statiche, abbiamo bisogno di metodi statici in quanto non fanno parte della variabile di istanza. E senza metodi statici, manipolare le proprietà statiche richiede molto tempo.


I metodi statici dovrebbero essere chiamati sulla classe, i metodi di istanza dovrebbero essere richiamati sulle istanze della classe. Ma cosa significa in realtà? Ecco un esempio utile:

Una classe di auto potrebbe avere un metodo di istanza chiamato Accelerate (). Puoi solo accelerare un'auto, se l'auto esiste realmente (è stata costruita) e quindi questo sarebbe un metodo di istanza.

Una classe di auto potrebbe anche avere un metodo di conteggio chiamato GetCarCount (). Ciò restituirebbe il numero totale di automobili create (o costruite). Se non sono state costruite auto, questo metodo restituirebbe 0, ma dovrebbe essere ancora in grado di essere chiamato, e quindi dovrebbe essere un metodo statico.


I metodi statici non devono essere invocati sull'oggetto e questo è quando lo si utilizza. Esempio: il tuo Main () è statico e non si crea un oggetto per chiamarlo.


I metodi statici possono essere usati se

  • Non si vuole eseguire un'azione su un'istanza (metodi di utilità)

    Come menzionato in alcune delle risposte di cui sopra in questo post, convertendo miglia e chilometri, o calcolando la temperatura da Fahrenheit a Celsius e viceversa. Con questi esempi che usano il metodo statico, non ha bisogno di istanziare l'intero nuovo oggetto nella memoria heap. Considera di seguito

    1. new ABCClass(double farenheit).convertFarenheitToCelcium() 
    2. ABCClass.convertFarenheitToCelcium(double farenheit)
    

    il primo crea una nuova impronta di classe per ogni metodo invocato, Performance, Pratica . Esempi sono la classe StringUtils della libreria Math e Apache-Commons di seguito:

    Math.random()
    Math.sqrt(double)
    Math.min(int, int)
    StringUtils.isEmpty(String)
    StringUtils.isBlank(String)
    
  • Uno vuole usare come una semplice funzione. Gli input vengono inoltrati esplicitamente e i dati dei risultati vengono restituiti come valore di ritorno. Eredità, l'istanziazione dell'oggetto non entra in scena. Conciso, leggibile .

NOTA : Poche persone discutono contro la testabilità dei metodi statici, ma anche i metodi statici possono essere testati! Con jMockit, si possono prendere in giro metodi statici. Testabilità Esempio di seguito:

new MockUp<ClassName>() {
    @Mock
    public int doSomething(Input input1, Input input2){
        return returnValue;
    }
};

No, i metodi statici non sono associati a un'istanza; appartengono alla classe. I metodi statici sono il tuo secondo esempio; i metodi di istanza sono i primi.


I metodi statici non sono associati a un'istanza, quindi non possono accedere a nessun campo non statico nella classe.

Dovresti utilizzare un metodo statico se il metodo non utilizza campi (o solo campi statici) di una classe.

Se vengono utilizzati campi non statici di una classe, è necessario utilizzare un metodo non statico.


Mi chiedo quando utilizzare i metodi statici?

  1. Un uso comune per static metodi static è accedere ai campi static .
  2. Ma puoi avere metodi static , senza fare riferimento a variabili static . I metodi di supporto senza riferimento a variabili static possono essere trovati in alcune classi java come java.lang.Math

    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }
    
  3. L'altro caso d'uso, posso pensare a questi metodi combinati con synchronized metodo synchronized è l'implementazione del blocco a livello di classe in ambiente multi-thread.

Diciamo se ho una classe con pochi getter e setter, un metodo o due, e voglio che quei metodi siano invocabili solo su un oggetto istanza della classe. Questo significa che dovrei usare un metodo statico?

Se è necessario accedere al metodo su un oggetto istanza della classe, il metodo dovrebbe essere non statico.

La page documentazione di Oracle fornisce ulteriori dettagli.

Non sono consentite tutte le combinazioni di variabili e metodi di istanza e classe:

  1. I metodi di istanza possono accedere direttamente alle variabili di istanza e ai metodi di istanza.
  2. I metodi di istanza possono accedere direttamente alle variabili di classe e ai metodi di classe.
  3. I metodi di classe possono accedere direttamente alle variabili di classe e ai metodi di classe.
  4. I metodi di classe non possono accedere direttamente alle variabili di istanza o ai metodi di istanza, devono utilizzare un riferimento a un oggetto. Inoltre, i metodi di classe non possono utilizzare questa parola chiave in quanto non vi è alcuna istanza a cui fare riferimento.

Dopo aver letto gli articoli di Misko, credo che i metodi statici siano negativi dal punto di vista del test. Dovresti invece avere factories (magari usando uno strumento di iniezione delle dipendenze come Guice ).

come faccio ad assicurarmi di avere solo uno di qualcosa

solo uno di qualcosa Il problema di "Come faccio ad assicurarmi di avere solo uno di qualcosa" è opportunamente aggirato. Istanziate solo una singola ApplicationFactory nel vostro main e, di conseguenza, istanziate solo una singola istanza di tutti i vostri singleton.

Il problema di base con i metodi statici è che sono codice procedurale

Il problema di base con i metodi statici è che sono codice procedurale. Non ho idea di come testare il codice procedurale unit-test. I test unitari presuppongono che io possa istanziare un pezzo della mia domanda da solo. Durante l'istanziazione collego le dipendenze con mock / friendlies che sostituiscono le dipendenze reali. Con la programmazione procedurale non c'è nulla da "collegare" poiché non ci sono oggetti, il codice e i dati sono separati.


L'operazione get (i) in ArrayList è più veloce di LinkedList, perché:
ArrayList: implementazione dell'array ridimensionabile dell'interfaccia List
LinkedList: implementazione dell'elenco doppiamente collegato delle interfacce List e Deque

Le operazioni che indicizzano nella lista attraverseranno la lista dall'inizio o dalla fine, a seconda di quale sia più vicino all'indice specificato.





java static-methods