metodi - quando usare static java




Classi statiche in Java (6)

C'è qualcosa come static class in java?

Qual è il significato di una tale classe. Anche tutti i metodi della classe statica devono essere static ?

È richiesto il contrario, che se una classe contiene tutti i metodi statici, anche la classe deve essere statica?

A cosa servono le classi statiche?


Bene, Java ha "classi nidificate statiche", ma non sono affatto come le classi statiche di C #, se è da dove vieni. Una classe nidificata statica è solo una che non ha implicitamente un riferimento a un'istanza della classe esterna.

Le classi nidificate statiche possono avere metodi di istanza e metodi statici.

Non esiste una classe statica di primo livello in Java.


Cosa succede quando un membro all'interno di una class viene dichiarato come static ..? È possibile accedere ai membri senza creare un'istanza della class . Pertanto, rendere static classe esterna (classe di livello superiore) non ha significato. Pertanto non è permesso.

Ma puoi impostare le classi interne come statiche (dato che è un membro della classe di livello superiore). Quindi è possibile accedere a tale classe senza creare un'istanza della classe di livello superiore. Considera il seguente esempio.

public class A {
    public static class B {

    }
}

Ora, all'interno di una classe diversa C , è possibile accedere alla classe B senza creare un'istanza di classe A

public class C {
    A.B ab = new A.B();
}

static classi static possono avere anche membri non-static . Solo la classe diventa statica.

Ma se la parola chiave static viene rimossa dalla classe B , non è possibile accedervi direttamente senza creare un'istanza di A

public class C {
    A a = new A();
    A.B ab = a. new B();
}

Ma non possiamo avere membri static all'interno di una classe interiore non-static .


Java ha classi nidificate statiche ma sembra che tu stia cercando una classe statica di primo livello. Java non ha modo di creare una classe statica di primo livello ma è possibile simulare una classe statica come questa:

  • Dichiara la tua final classe - Impedisce l'estensione della classe poiché l'estensione di una classe statica non ha senso
  • Rendi private il costruttore - Impedisce l'istanziazione del codice client poiché non ha senso creare un'istanza di una classe statica
  • Rendi static tutti i membri e le funzioni della classe - Poiché non è possibile creare un'istanza della classe, non è possibile chiamare alcun metodo di istanza o accedere ai campi di istanza
  • Nota che il compilatore non ti impedirà di dichiarare un membro istanza (non statico). Il problema verrà visualizzato solo se si tenta di chiamare il membro dell'istanza

Semplice esempio per suggerimenti dall'alto:

public class TestMyStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
        System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // results in compile time error
     }
}

// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
    private MyStaticClass () { // private constructor
        myStaticMember = 1;
    }
    private static int myStaticMember;
    public static void setMyStaticMember(int val) {
        myStaticMember = val;
    }
    public static int getMyStaticMember() {
        return myStaticMember;
    }
    public static int squareMyStaticMember() {
        return myStaticMember * myStaticMember;
    }
}

A che servono le classi statiche? Un buon uso di una classe statica consiste nella definizione di classi una tantum, di utilità e / o di libreria in cui l'istanziazione non avrebbe senso. Un grande esempio è la classe Math che contiene alcune costanti matematiche come PI ed E e fornisce semplicemente calcoli matematici. Richiedere l'istanziazione in questo caso sarebbe inutile e confusionario. Vedi la classe Math di Java . Si noti che è definitivo e tutti i suoi membri sono statici. Se Java consentiva di dichiarare statiche le classi di livello superiore, la classe Math sarebbe effettivamente statica.


Java ha metodi statici associati alle classi (ad es. Java.lang.Math ha solo metodi statici), ma la classe stessa non è statica.


Sì, esiste una classe nidificata statica in java. Quando si dichiara una classe nidificata statica, questa diventa automaticamente una classe autonoma che può essere istanziata senza dover istanziare la classe esterna a cui appartiene.

Esempio:

public class A
{

 public static class B
 {
 }
}

Poiché la class B è dichiarata statica, puoi esplicitamente creare un'istanza come:

B b = new B();

Nota se la class B non è stata dichiarata statica per renderla autonoma, una chiamata all'oggetto di istanza avrebbe avuto questo aspetto:

A a= new A();
B b = a.new B();

Visto che questo è il miglior risultato su Google per "static class java" e la risposta migliore non è qui ho pensato di aggiungerla. Sto interpretando la domanda di OP riguardo alle classi statiche in C #, che sono conosciute come singleton nel mondo Java. Per chi ignora, in C # la parola chiave "statica" può essere applicata a una dichiarazione di classe, il che significa che la classe risultante non può mai essere istanziata.

Estratto da "Effective Java - Second Edition" di Joshua Bloch (ampiamente considerato come una delle migliori guide in stile Java disponibili):

A partire dalla versione 1.5, esiste un terzo approccio per implementare i singleton. Basta creare un tipo enum con un elemento:

// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;
    public void leaveTheBuilding() { ... }
}

Questo approccio è funzionalmente equivalente all'approccio del campo pubblico, tranne che è più conciso, fornisce il meccanismo di serializzazione gratuito e fornisce una garanzia ferrea contro l'istanziazione multipla, anche di fronte a sofisticati attacchi di serializzazione o riflessione. Sebbene questo approccio debba ancora essere ampiamente adottato, un tipo di enum a elemento singolo è il modo migliore per implementare un singleton. (enfasi dell'autore)

Bloch, Joshua (2008-05-08). Efficace Java (serie Java) (pagina 18). Pearson Education.

Penso che l'implementazione e la giustificazione siano piuttosto auto-esplicative.







static-classes