Получение всех объектов, принадлежащих классу - PullRequest
2 голосов
/ 08 ноября 2010

Я родом из Ruby on Rails и начал заниматься программированием на Android.

Я ищу способ получить список всех объектов в классе, используя Java.

В Rails вы можете сделать что-то вроде Building.all, и он вернет массив всех созданных зданий

Есть ли что-то подобное в Java?

Если это так, можете ли вы опубликовать небольшой пример, который будет возвращать массив строительных объектов для класса Building?

Ответы [ 3 ]

3 голосов
/ 08 ноября 2010

Нет. Но если вы хотите иметь такой список, вы можете заполнить его самостоятельно:

private static final Set<WeakReference<Building>> instances = 
       Setes.newSetFromMap(new IdentityHashMap<WeakReference<Building>>());

public Building() {
     synchronized(Building.class) {
         instances.add(new WeakReference(this));
     }
}

// etc the same in all constructors

Sets.newSetFromMap(..) из библиотек guava. Если вы не хотите их использовать, вы можете просто использовать Map и put(this, Boolean.TRUE)

WeakReference означает, что объекты будут собираться мусором, если они не используются где-либо еще. IdentifyHashMap означает, что не имеет значения, переопределите ли вы hashCode() и equals(), ваша карта будет заполнена различными экземплярами. (спасибо Люку Хаттеману за эти улучшения)

Спорно ли это должно быть достигнуто таким образом. Я бы сказал, что тот, кто создает экземпляры, может хранить ссылки на них, а не на сам класс.

2 голосов
/ 08 ноября 2010

Building.all работает только в Rails, поскольку класс также является точкой входа для объектно-реляционных запросов ActiveRecord.Когда вы говорите Building.all, он запускает SQL-запрос для извлечения всех строительных объектов из таблицы зданий.

Таким образом, реальным эквивалентом в Java является использование инструмента ORM, использующего шаблон Active Record.Есть несколько таких, как , этот , но я не могу найти ни одного, который действительно завоевал популярность.Не знаю, можно ли его использовать с Android.

Можно ли использовать Grails с Android?Если вы хотите вернуться в свою зону комфорта Rails, но в мире JVM это ваш лучший выбор.

1 голос
/ 08 ноября 2010

Луис, когда в Rails вы вызываете Building.all, на самом деле происходит много вещей:

  1. Rails запрашивает БД (в БД должна быть таблица «зданий»).
  2. тогда полученный от БД запрос «анализируется» для коллекции экземпляров Building.

Так что, если вы ищете то же волшебство на Android, которое будет доступно прямо из коробкиК сожалению, это не так.Вместо этого вы должны реализовать свой собственный подход ORM и миграцию.Отправной точкой является SQLiteOpenHelper .

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