Modifica del contenuto di una raccolta al di fuori dell'ambito di un metodo di istanza?

0

È consigliabile non modificare mai il contenuto di un Collection passato come parametro?

Voglio orgSet per avere solo parole. Ma, a volte ci sono un stringhe di carattere (come punti interrogativi, virgole, ecc.) Che voglio rimuovere dal set di parole. Questi non sono i metodi completi, ma questo è il mio punto:

 public static Set<String> removeSyntax_Foo(Set<String> orgSet) {
        Set<String> tmpSet = new HashSet();  
        for(String s : orgSet) {
            if(s.length()!=1) { tmpSet.add(s); }
            if(Character.UnicodeBlock.of(s.charAt(0)) == Character.UnicodeBlock.GENERAL_PUNCTUATION) { continue; }
            tmpSet.add(s);
        }
        return tmpSet;
    }

    public static void removeSyntax_Bar(Set<String> orgSet) {
        Set<String> tmpSet = new HashSet();
        tmpSet.addAll(orgSet);
        orgSet.clear();

        for(String s : tmpSet) {
            if(s.length()!=1) { orgSet.add(s); }
            if(Character.UnicodeBlock.of(s.charAt(0)) == Character.UnicodeBlock.GENERAL_PUNCTUATION) { continue; }   
            orgSet.add(s);
        }
    }

removeSyntax_Foo() ha il potenziale per una perdita di memoria incurante. In realtà ho una lista di metodi statici che uso per ripulire il mio Set di parole. Se ognuno di questi metodi crea una nuova collezione ... Tuttavia, ritengo che questa sia la soluzione corretta da usare.
removeSyntax_Bar() mescola il contenuto della Set dell'invocatore che potrebbe essere una grande sorpresa per l'invocatore. Non dovresti farlo, giusto?

È removeSyntax_Foo() o removeSyntax_Bar() best practice?

    
posta david 16.12.2015 - 05:32
fonte

2 risposte

2

La variante _Foo() , considerando l'input come di sola lettura, è più sicura per i thread. Ad esempio, un thread parallelo potrebbe fare qualcos'altro con origSet (di nuovo, in sola lettura) mentre il codice sta tagliando la punteggiatura. La variante _Foo() causerà meno sorprese e probabilmente meno bug. E, è più flessibile per i requisiti futuri. Ad esempio, qualcuno aggiunge un requisito per creare un set di punteggiatura. Possibile con la versione _Bar() , ma molto più facile con _Foo()

    
risposta data 18.12.2015 - 07:48
fonte
0

La risposta è per lo più sei di una, mezza dozzina di altre.
Per il mio semplice bisogno di pulire markup, numeri, sintassi, ecc. Di un documento tokenizzato, removeSyntax_bar() ha senso; quelli sono semplici metodi di utilità. Tuttavia, per la progettazione dell'interfaccia destinata al consumo pubblico, removeSyntax_foo() è ciò che si suppone di fare.

    
risposta data 18.12.2015 - 05:38
fonte

Leggi altre domande sui tag