Qual è il miglior design per contenere una lista mutabile "globale"?

1

Diciamo che ho un ArrayList di classe Person e ho due oggetti che vengono generati da due classi diverse che leggono e scrivono in questo ArrayList.

Ad esempio,

public class Main { 
   public static void main(String[] args) { 
       A a = new A();
       B b = new B();
   }
}

Quale è, a tuo parere, il miglior design per gestire questo ArrayList. Posso pensare a due opzioni:

  1. crea l'elenco array nella classe principale:

    public class Main { 
       public static ArrayList<Person> list = new ArrayList<>();
    
       public static void main(String[] args) { 
           A a = new A();
           B b = new B();
       }
    }
    

    e quindi accedi all'elenco all'interno delle classi A e B tramite Main.list .

  2. Crea l'ArrayList come variabile locale nel metodo main e invialo al costruttore di A e B.

    public class Main {
        public static void main(String[] args) {
            ArrayList<Person> list = new ArrayList<>(); 
            A a = new A(list);
            B b = new B(list);
        }
    }
    
    public class A { 
        private ArrayList<Person> list;
        public A(ArrayList<Person> list) { 
           this.list = list;
        }
    }
    

    e quindi list è un attributo degli oggetti A e B.

posta CrazySynthax 27.05.2017 - 16:23
fonte

2 risposte

9

Con l'opzione 1, la tua lista è in realtà uno stato mutabile globale che è solitamente considerato una cosa brutta. Passare le dipendenze ai costruttori come fai nell'opzione 2 è la cosa giusta da fare.

Potrebbero esserci problemi con la tua opzione 2 come la concorrenza come menzionato da Laiv in un commento, main non potrebbe essere il posto migliore per questo codice o potresti voler usare le fabbriche per istanziare A o B per nominarne alcuni, ma non hai fornito un contesto sufficiente per valutare questi potenziali problemi. Come è scritto, l'opzione 2 mi sta bene.

    
risposta data 27.05.2017 - 17:23
fonte
1

Ho visto questo gestito con un blocco di lettura e un blocco di scrittura. Quando un blocco di scrittura è trattenuto da un thread, il blocco di lettura non può essere ottenuto da alcun thread e nessun altro thread può ottenere il blocco di scrittura. Quando un thread tiene il blocco di lettura, anche altri thread possono ottenere il blocco di lettura, ma nessun thread può ottenere il blocco di scrittura. I dati possono essere mutati solo quando un thread mantiene il blocco di scrittura (e in base alla progettazione nessun thread mantiene un blocco di lettura). Ciò garantisce che nessuno muti i dati mentre viene letto. Inoltre, in questo scenario, c'era solo un singolo thread che è stato in grado di ottenere il blocco di scrittura. (Era il thread principale dell'interfaccia utente perché i dati venivano modificati dall'utente che apportava modifiche all'interfaccia utente.) Un'architettura simile potrebbe funzionare per il tuo scenario.

    
risposta data 28.05.2017 - 05:21
fonte

Leggi altre domande sui tag