Organizzazione di classi con molte proprietà che devono essere ripetute

4

A volte quando lavoro con una classe (di solito una che rappresenta un modello di database), avrò circa 15 diverse proprietà su di essa, di solito di tipi diversi. Queste sono proprietà che devono essere accessibili anche dagli utenti, quindi ogni proprietà avrà in genere bisogno di alcune funzioni come

T getPropertyName();
setPropertyName(T value);

Ma è anche estremamente importante per me essere in grado di scorrere tutte le proprietà in un ordine particolare (sebbene, suppongo che il "valore" possa derivare dalla pigrizia di non dover digitare ciascuna di esse individualmente). Esiste un modo logico per configurare questa classe, in modo da poterla scorrere in questo ordine? O sono impotente per l'organizzazione, e dovrei tornare alle basi per avere 15 variabili private e 15 "getter" e "setter"?

Per inciso, attualmente sto lavorando con Android e Java, quindi le risposte che riguardano specificamente questo sarebbero le più utili, ma vedendo come mi imbatto anche in altri linguaggi, qualsiasi soluzione sarebbe l'ideale.

Modifica: stavo pensando di utilizzare qualcosa di simile a un pacchetto con un elenco di chiavi, ma non so quanto sarebbe effettivamente efficace.

    
posta Andrew Hays 05.06.2011 - 13:42
fonte

5 risposte

1

Usa la riflessione per un dato oggetto per scoprire i suoi metodi getX / setX, quindi richiamali quando necessario.

Nota che in ambienti restrittivi potresti non essere autorizzato a farlo.

    
risposta data 05.06.2011 - 14:03
fonte
1

Se non ti dispiace un po 'di ripetizione se significa evitare "magia" ... Usa una classe nidificata (non static ) che implementa java.util.Map<String,Object> . Ciò fornisce un modo uniforme per il codice esterno per enumerare un insieme di proprietà che si sceglie, mantenendo nascosti i dettagli di implementazione (ad esempio riflessione e un mucchio di clausole if / then).

public class Product {
    private String productName;
    private int productPrice;
    private PropMap props = new PropMap();

    class PropMap implements Map<String,Object>{
    /* Reflection, or if-then statements, etc. 
       Access outer items ex: this.Product.productName

       Throw exceptions if someone tries to store the wrong 
       kind of item.

       keySet() and 'iterator()' will need to return implementations 
       that provide things in an appropriate order.
    */
    }

    public PropMap getPropMap(){
        return props;
    }

}

Quindi il codice esterno potrebbe andare:

Map<String,Object> m = myobj.getPropMap();
for(m.keySet(): String k):
    Object v = m.get(k);
}

È anche possibile refactificare PropMap nella sua stessa classe, ProductPropMap , ma poi non avrebbe accesso a private elementi.

    
risposta data 06.06.2011 - 08:30
fonte
0

I setter e i getter possono accedere a una sorta di raccolta (privata) che rendi anche accessibile. Fondamentalmente ogni proprietà dovrebbe conoscere un valore chiave nella collezione per ottenere il valore che rappresenta. Puoi ordinare / ordinare nella raccolta.

Una soluzione basata su riflessione è probabilmente più manutenibile però.

    
risposta data 05.06.2011 - 14:58
fonte
0

Se vuoi scorrere su quell'oggetto, perché non iniziare a guardare su Scala su Android? In questo sono serio. Puoi utilizzare l'oggetto scala.Product o qualsiasi oggetto che lo implementa per arrivare al ennesimo elemento di una lista. Quindi, se desideri un'iterazione ordinata, devi semplicemente creare un elenco di interi da attraversare.

Naturalmente, se questo non è per te, ci sono altre soluzioni. Puoi reimplementare una Tupla in Java o provare a trovare una libreria preesistente che contenga tuple.

    
risposta data 05.06.2011 - 15:51
fonte
0
private Map property;

Public String getPropertyValue(String Key)
{
     return (p.get(Key));
}

Poiché conosci i tasti che puoi ordinare come preferisci. Spero che questo funzioni

    
risposta data 06.06.2011 - 02:01
fonte

Leggi altre domande sui tag