spiegato - static import java




Java: quando utilizzare i metodi statici (14)

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!


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.

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.

Esistono alcuni validi motivi per utilizzare i metodi statici:

  • Prestazioni : se si desidera eseguire un codice e non si desidera creare un'istanza di un oggetto aggiuntivo, inserirlo in un metodo statico. La JVM può anche ottimizzare molto i metodi statici (penso di aver letto una volta James Gosling dichiarando che non hai bisogno di istruzioni personalizzate nella JVM, poiché i metodi statici saranno altrettanto veloci, ma non potrebbero trovare la fonte - quindi potrebbe essere completamente falso). Sì, è micro-ottimizzazione e probabilmente non necessario. E noi programmatori non facciamo mai cose non necessarie solo perché sono cool, giusto?

  • Praticità : invece di chiamare il new Util().method(arg) Util.method(arg) new Util().method(arg) , chiama Util.method(arg) o method(arg) con le importazioni statiche. Più facile, più breve.

  • Aggiunta di metodi : si voleva davvero che la classe String avesse un metodo di istanza removeSpecialChars() , ma non è lì (e non dovrebbe, dato che i caratteri speciali del progetto potrebbero essere diversi da quelli dell'altro progetto), e non è possibile aggiungerlo (poiché Java è in qualche modo sano di mente), quindi si crea una classe di utilità e si chiama removeSpecialChars(s) anziché s.removeSpecialChars() . Dolce.

  • Purezza : prendendo alcune precauzioni, il tuo metodo statico sarà una funzione pura , cioè l'unica cosa che dipende dai suoi parametri. Dati in, dati in uscita. Questo è più facile da leggere ed eseguire il debug, dal momento che non si hanno problemi di ereditarietà di cui preoccuparsi. Puoi farlo anche con i metodi di istanza, ma il compilatore ti aiuterà un po 'di più con i metodi statici (non consentendo riferimenti ad attributi di istanza, metodi di sovrascrittura, ecc.).

Dovrai anche creare un metodo statico se vuoi fare un singleton, ma ... no. Voglio dire, pensaci due volte.

Ora, ancora più importante, perché non vorresti creare un metodo statico? Fondamentalmente, il polimorfismo esce dalla finestra . Non sarai in grado di sovrascrivere il metodo, né di dichiararlo in un'interfaccia (pre-Java 8) . Ci vuole molta flessibilità fuori dal tuo progetto. Inoltre, se hai bisogno di stato , finirai con un sacco di bug di concorrenza e / o colli di bottiglia se non stai attento.


I metodi e le variabili statici sono la versione controllata delle funzioni e delle variabili "globali" in Java. In quali metodi è possibile accedere come classname.methodName() o classInstanceName.methodName() , ad esempio è possibile accedere a metodi e variabili statiche utilizzando il nome della classe e le istanze della classe.

La classe non può essere dichiarata come statica (perché non ha senso: se una classe è dichiarata pubblica, è accessibile da qualsiasi luogo), le classi interne possono essere dichiarate statiche.


I metodi statici in java appartengono alla classe (non un'istanza di essa). Non usano variabili di istanza e di solito prendono input dai parametri, eseguono azioni su di esso, quindi restituiscono alcuni risultati. I metodi di istanze sono associati agli oggetti e, come suggerisce il nome, possono utilizzare variabili di istanza.


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;
    }
};

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.


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.


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.


Statico: Obj.someMethod

Usa static quando vuoi fornire l'accesso a livello di classe a un metodo, cioè dove il metodo dovrebbe essere chiamabile senza un'istanza della classe.


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.");
     }
  }

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ò.)


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





static-methods