Con il modello di progettazione di Static Factory Constructor esiste un modo preferito per rimuovere "tutti" i riferimenti agli oggetti?

2

Considera la seguente implementazione di un modello di fabbrica statico ...

public class Names{
private static final Map<String, Name> NAME_MAP = new HashMap<>();
private final String firstName, lastName, strRep;


public static Name getInstance(String firstName, String lastName) throws IllegalArgumentException {
        /*
        Check parameters.
        */
        String firstName = firstName.toUpperCase();
        String lastName = lastName.toUpperCase();
        String strRep = firstName + " " + lastName;
        // "strRep" is a string concatenation which uses the first name and last name in conjunction.

        if (strRep.matches("^[A-Z]+ [A-Z]+$")) {
            strRep = firstName + " " + lastName;
            Name name = NAME_MAP.get(strRep);
            if (name == null) {
                name = new Name(firstName, lastName, strRep);
                NAME_MAP.put(strRep, name);
            }
            return name;
        } else {
            throw new IllegalArgumentException("The parameters entered are invalid.");
        }

    }

Consideriamo la situazione nella nostra base di codici che usiamo temporaneamente un nuovo oggetto Nome (diciamo come variabile locale). Poiché la mappa contiene un riferimento a un oggetto, ora sembra che dobbiamo pulire manualmente quella mappa. Questo è il contrario di fare affidamento sulla garbage collection per ripulire i riferimenti a oggetti inutilizzati (in normali costruttori). Esiste un modo preferito per ripulire tutti i riferimenti agli oggetti senza che un cliente usi la fabbrica per farlo manualmente?

    
posta Callum Dempsey Leach 12.05.2018 - 22:45
fonte

2 risposte

5

Nell'implementazione di fabbrica metti in cache tutti gli oggetti nome creati, restituendo la stessa istanza se viene richiesto un nuovo nome con lo stesso nome e cognome.

Quando crei una cache come questa dovresti assicurarti che non cresca semplicemente per sempre. Devi limitare il numero di elementi che contiene e rimuovere quelli vecchi quando raggiungi tale limite.

Il tuo problema non è la garbage collection ma è l'implementazione della cache semplicistica.

Ad esempio, è possibile aggiungere una variabile DateLastAccessed e MaxObjects alla cache. quando premi MaxObjects rimuovi il Nome meno utilizzato prima di aggiungerne uno nuovo.

    
risposta data 13.05.2018 - 06:53
fonte
2

Sembra che tu sia molto evasivo su quale sia il tuo problema reale, ma non hai mostrato la necessità di trattenere le istanze Name affatto . Basta restituire un new Name ogni chiamata e lasciare che il GC lo risolva. A quel punto puoi spostarlo nel costruttore Name

Per inciso, sembra che tu stia mutando i tuoi parametri per fare la tua validazione. Intendi per tutti Name s essere maiuscolo?

    
risposta data 14.05.2018 - 10:59
fonte

Leggi altre domande sui tag