La classe con solo dati statici deve essere istanziata?

1

Ho due classi. 1. Nodo 2. MixedStateManager

Classe Node:

La classe nodo mantiene lo stato dei nodi nel sistema. Uno di questi dati è stato.

public class Node
   {   
      private int state;

     public void setState(int s)
     {
      state = s;
     }

     public int getState()
     {
       return state;
     }
    }

MixedStateManager:

MixedStateManager vede se tutti i nodi nel sistema si trovano nello stesso stato oppure no. Se i nodi non hanno lo stesso valore per il valore di stato, allora il sistema si dice che sia in MixedState. Ho una variabile mixedState per lo stesso. L'ho reso statico perché, se il valore viene modificato da un'istanza della classe, dovrebbe essere visibile da altri. Un'altra cosa da notare è che MixedStateManager è chiamato da diversi thread che cambiano il valore dello stato dei nodi.

public class MixedStateManager{

public static boolean mixedState;

public boolean isMixedState(){
 return mixedState;
}

public void setMixedState(){
// get all instances of Node class;
   if state of all instances are same 
     mixedState = true;
   else
     mixedState = false
}
}

Domanda: poiché MixedStateManager ha solo un dato statico, ha senso creare un'istanza di questa classe e quindi impostare il valore. Oppure posso anche rendere statici tutti i metodi?

Le risposte saranno apprezzate. Grazie

    
posta Praveen Hassan 24.07.2015 - 16:24
fonte

3 risposte

5

Direi che nessuna classe dovrebbe mai avere dati statici. Questo è il modo per testare il codice infernale e non infetto.

Inoltre:

  1. Rende statici solo i metodi se hanno effetti collaterali zero (cioè elaborano solo i dati passati come parametri in modo deterministico).
  2. Non associare classi, ad esempio il fatto che setMixedState si basi sull'accesso a Node , passare il metodo di cui ha bisogno.

Invece hai un metodo come:

public static bool areNodesMixedState(Node[] nodes) {
    if (state of all instances are same) {
        return true;
    else
        return false
    }
}
    
risposta data 24.07.2015 - 16:33
fonte
1

Puoi renderlo tutto statico, ma ciò comporterà (probabilmente) un accoppiamento e un'amplificazione più forti non necessari; dipendenza tra i clienti del gestore e il gestore.

Pertanto, sono d'accordo con @DavidArno su come evitare lo stato statico il più possibile.

Come notato da @RobertHarvey, per la registrazione, utilizzo una variabile statica per contenere un riferimento a un oggetto logger perché mantenere quel riferimento ovunque si voglia aggiungere la registrazione può essere eccessivamente oneroso.

Hai già il manager come oggetto, il che è buono, quindi se hai bisogno di uno stato per il manager, dovresti spostarlo dalla classe all'oggetto (rimuovendo la dichiarazione static ).

    
risposta data 24.07.2015 - 18:11
fonte
0

Una classe statica con solo metodi statici e dati statici non è altro che una collezione di variabili globali e una libreria di funzioni mascherate da qualcosa che assomiglia a OO.

Una tale classe non ha bisogno di essere istanziata perché il risultato non sarà un oggetto, solo una shell vuota.

    
risposta data 25.07.2015 - 23:01
fonte

Leggi altre domande sui tag