Обработка классов, повторяющийся код

287
16 мая 2017, 02:56

У меня есть несколько классов данных (например, realm таблицы). Я обрабатываю каждый из них одинкаовым способом (см. код ниже).

Меняются только имена классов : "Ticket.class", далее например "SecondTable.class" и т.д. Имена классов заранее известны.

Q1. Как мне определить метод с аргументом типа класс ?

Q2. Или как сделать что-то типа "for each [classes] do ..." ?

Realm realm = Realm.getDefaultInstance();
    RealmResults<Ticket> tickets = realm.where(Ticket.class)
            .findAll();
    realm.beginTransaction();
    for (int i = tickets.size() - 1; i >= 0; i--) {
        if ... {
            Notification notification = new NotificationCompat.Builder(this)...;
            StartMyAsyncTask().execute(tickets.get(i));
            // etc...
            // delete from DB
            tickets.get(i).removeFromRealm();
        }
    }
    realm.commitTransaction();

   public class Ticket extends RealmObject {... }
Answer 1

Дублирую свой ответ со StackOverflow

Можно создать некий объединяющий интерфейс:

public interface IAction {
    void action(); 
}

для классовTicket и SecondTable, а затем реализовать его в соответствии с логикой класса:

public class Ticket extends RealmObject implements IAction {
    @Override
    public void action(){...}
}

Следующим шагом нужно создать шаблонный метод (полагаю, определить его можно в классе утилит):

public static <T extends RealmObject & IAction> void yorForEachMethod(Class<T> cls) {
    Realm realm = Realm.getDefaultInstance();
    RealmResults realmObjects = realm.where(cls).findAll();
    realm.beginTransaction();
    for (int i = realmObjects.size() - 1; i >= 0; i--) {
        if ... {
            Notification notification = new NotificationCompat.Builder(this)...;
            // здесь можно безопасно приводить к типу интерфейса IAction и вызывать его методы
            ((IAction)realmObjects.get(i)).action();
            // или можно передавать интерфейс в асинхронную задачу
            //StartMyAsyncTask().execute((IAction)realmObjects.get(i));
            // etc...
            // delete from DB
            realmObjects.get(i).removeFromRealm();
        }
    }
    realm.commitTransaction(); 
}
READ ALSO
Как проверить карта двигается или нет?

Как проверить карта двигается или нет?

Есть картинка и в зависимости от того клиент двигает карту или нет она будет отображатьсяТо есть открылась карта на ней стоит прикрепленная...

383
как решать проблему с org.springframework.beans.factory.BeanDefinitionStoreException: [требует правки]

как решать проблему с org.springframework.beans.factory.BeanDefinitionStoreException: [требует правки]

Новичок в Spring mvc и второй день не могу запустить Tomcat:

242
Метод цепочек, HashMap

Метод цепочек, HashMap

Как реализовать "метод цепочек"?

283