Crea oggetti diversi a seconda del tipo

Ho una tabella di database che contiene una colonna denominata tipo. Per each row nella colonna del database, devo creare un object a seconda del tipo. Al momento uso se altre dichiarazioni per questo:

if (type.equals("object1")){ Object1 object1 = new Object1(); } else if (type.equals("object2")){ Object2 object2 = new Object2(); } 

Un po 'più bello sarebbe usare un enum, in quanto il numero di tipi è limitato, ma c'è la possibilità di lasciare che la creazione di un object dipenda dal valore della String?

  • Bug Android? : String.substring (5) .replace ("", "" // string vuota
  • Come posso submit una string attraverso NFC durante la visualizzazione dello schermo?
  • Vista trasparente su ImageView
  • Limitate opzioni per Android Developer
  • come faccio a fare uno screenshot di layout android?
  • Non hai trovato la class "android.support.v7.internal.widget.TintManager" sul path: DexPathList
  • Sono aperta a suggerimenti che potrebbero risolvere il mio problema in un modo diverso da quello che sto cercando.

  • Come gestire NullPointerException in android?
  • Stato HTTP 403 - Il nodo CSRF non valido 'null' è stato trovato nel parametro di richiesta
  • Come cambiare il colore del button?
  • come caricare l'image con Universal ImageLoader senza visualizzare
  • Qual è il vantaggio di ViewHolder?
  • Android, Termina tutte le attività
  • 5 Solutions collect form web for “Crea oggetti diversi a seconda del tipo”

    Puoi usare

     Object o = Class.forName(type).newInstance(); 

    Se hai un int e due stringhe come argomenti che ti serve.

     Object o = Class.forName(type) .getConstructor(int.class, String.class, String.class) .newInstance(intValue, string1, string2); 

    Un'altra possibilità è quella di utilizzare methods di fabbrica

     Object o = getClass().getMethod("create_" + type).invoke(null); static Object1 create_object1() { return new Object1(/* with args */); } static Object2 create_object2() { return new Object2(/* with other args */); } 

    ma l'approccio più flessibile può essere quello di utilizzare un interruttore

     Object o; switch(type) { // in Java 7 case "object1": o = new Object1(); break; case "object2": o = new Object2(); break; 

    Quello che sarebbe più elegante sta utilizzando le chiusure in Java 8.

    http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html

    Potresti creare una mappa da String a Class e utilizzare newInstance . Ciò, tuttavia, si basa sull'esistenza di costruttori non-arg.

     import java.util.*; class Test { public static void main(String[] args) throws Exception { Map<String, Class<?>> classs = new HashMap<String, Class<?>>(); classs.put("object1", Object1.class); classs.put("object2", Object2.class); String type = "object2"; Object obj = classs.get(type).newInstance(); //... } } class Object1 { ... } class Object2 { ... } 
     package main; import java.util.ArrayList; import java.util.List; public class TempClass { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException { List<Class> classs = new ArrayList<Class>() {{ add(Class.forName("main.Object1")); add(Class.forName("main.Object2")); }}; for (Class aClass : classs) { Object o = aClass.newInstance(); } } } package main; public class Object1 { public Object1() { System.out.println("Object1"); } } package main; public class Object2 { public Object2() { System.out.println("Object2"); } } 

    Se le classi in questione fanno parte di una gerarchia di ereditarietà e si utilizza una sorta di tool / framework di mapping come Hibernate o iBATIS / MyBatis, potrebbe includere un modo per configurare i cosiddetti discriminatori.

    Potresti quindi configurare la colonna "type" come la colonna descriminator e mappare i valori supportti nelle classi. Il framework installa poi le classi appropriate per il recupero degli oggetti dal database.

    Utilizzando l' switch o if istruzioni costringono a codificare le varie opzioni, in modo da get una soluzione non così flessibile, a mio parere.

    Preferisco sempre scrivere codice che sia estensibile per gli sviluppi futuri del software.

    Quindi ti suggerisco di utilizzare Object o = Class.forName(type).newInstance(); mettendo nel database il nome della class che si desidera istanziare e, se necessario, un'etichetta personalizzata.

    EDIT

    Se devi passare un determinato parametro ai costruttori delle classi che wherete istanziare, è conveniente usare Constructor.newInstance() invece di Class.newInstance(); e utilizzare l'object Constructor per istanziare la class, ad esempio:

     Class myClass = Class.forName(type); // get the constructor you need specifying parameters type Constructor constructor = myClass.getConstructor(String.class); Object myObject = constructor.newInstance("constructor-arg"); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.