2013-04-19 6 views
0

У меня есть абстрактный класс записи, который представляет записи базы данных, которые имеют два абстрактных метода: getTable() и getColumns(). Затем у меня есть класс Customer, который расширяет Record и я реализую эти абстрактные методы в этом классе.java - создавать экземпляры объектов из абстрактного класса

Я пытаюсь выяснить, как я могу получить список всех Клиентов, но сохраните метод как можно многократно используемый, поэтому я бы предпочел метод getAllRecords (Record record), чем метод getAllCustomers().

Вот что у меня есть. Я не могу создать новую запись() объект, потому что это абстрактно и нужно создать экземпляр класса, который был принят в.

//i'd like to do something like this to get all of the Customers in the db 
// datasource.getAllRecords(new Customer()); 

public List<Record> getAllRecords(Record record) { 
    List<Record> records = new ArrayList<Record>(); 

    Cursor cursor = database.query(record.getTable(), 
     record.getColumns(), null, null, null, null, null); 

    cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
     Record record = cursorToRecord(cursor, record); 
     records.add(record); 
     cursor.moveToNext(); 
    } 
    // Make sure to close the cursor 
    cursor.close(); 
    return records; 
    } 

    private Record cursorToRecord(Cursor cursor, Record record) { 


    Record record = new Record(); <-- somehow clone a new instance of the record that was passed in 

    record.setId(cursor.getLong(0)); 
    record.setValue("aKey",cursor.getString(1)); 
    return record; 
    } 

бы, имеющие какой-то RecordRegistry объект имеют смысл, а не имеющие отдельные фабричные классы для каждого подкласса Record?

class RecordRegistry{ 

    private static final List<Record> RECORDS; 

    static { 
      final List<Record> records = new ArrayList<Record>(); 
      records.add(new Customer()); 
      records.add(new Company()); 

      RECORDS = Collections.unmodifiableList(records); 
    } 

    public List<Record> allRecords(){ 

     return RECORDS; 
    } 

    public Record buildRecord(Class cClass){ 

     String className = cClass.getName().toString(); 

     if(className.equalsIgnoreCase("customer")){ 
      return new Customer(); 
     }else if(className.equalsIgnoreCase("company")){ 
      return new Company(); 
     } 
     return null; 
    } 
} 
+0

Есть ли дети из класса Record, которые могут быть созданы? – Egor

+0

Клиент - это класс, который расширяет запись и может быть создан, да. – David

ответ

1

Вы можете получить класс Record при условии, что все подклассы Record будут иметь конструктор no-arg.

Record newRecord = record.getClass().newInstance(); 

Обратите внимание, что вы можете просто передать класс вместо самого объекта.

Вы также можете пройти завод, который будет отвечать за создание соответствующего класса.

interface RecordFactory { 
    Record create(); 
} 

class CustomerFactory implements RecordFactory { 
    Record create() { 
     return new Customer(); 
    } 
} 

public List<Record> getAllRecords(RecordFactory factory) { 
    ... 
    for(...) { 
     ... 
     Record record = factory.create(); 
     ... 
    } 
    ... 
} 
+0

i gotcha. Благодарю. Это то, что мне нужно – David

+0

@David Как отмечено в вопросе, это хрупкий дизайн, который не сработает во время выполнения, если отсутствовал конструктор no-arg. Я хотел бы призвать вас рассмотреть, действительно ли этот подход - это то, что вы хотите сделать. Это не очень "Java". –

+0

Oooh, я думаю, я не понял. В моем подклассе мне нужно иметь пустой метод построения? У вас есть идея подхода «Java»? – David

0

Нечетный прецедент. Я бы сделал реферат cursorToRecord. Это подталкивает логику к каждому классу, который знает, как построить себя из Cursor.

public abstract Record cursorToRecord(Cursor cursor, Record record); 
+0

Да, я думал об этом. Кажется, что беспорядок, но – David

+0

@David На отражении мои первоначальные предложения были немного напуганы. См. Править выше. –

+0

hmmm Я бы хотел, чтобы мои модели как агностик источника данных, насколько это возможно – David

0

Не прямо отвечая на ваш Q, но взгляните на Андроида руководств по контент-провайдеров (https://developer.android.com/guide/topics/providers/content-providers.html). Они обеспечивают гибкий доступ к данным среди других преимуществ. Я нашел их стоящими на начальном этапе обучения и настройки (особенно при использовании w/Loaders)

0

Что относительно отражения?

Record newRecord = record.getClass().newInstance(); 
Смежные вопросы