Как использовать ActiveResource с мелкими вложенными маршрутами?

Давайте попробуем по-другому объяснить это ...

Это последовательность, которую JVM проходит, когда вы впервые ссылаетесь на класс MyClass.

  1. Загрузить байт-код в память.
  2. Память для статического хранения очищена (двоичный ноль).
  3. Инициализировать класс:
    1. Выполнить каждый статический инициализатор в том порядке, в котором он появляется, включая статические переменные и блоки static { ... }.
    2. Затем JVM инициализирует вашу статическую переменную myClass новым экземпляром MyClass.
    3. Когда это происходит, JVM замечает, что MyClass уже загружен (байт-код) и находится в процессе инициализации , поэтому пропускает инициализацию.
    4. Выделить память в куче для объекта.
    5. Выполнить конструктор.
    6. Выведите значение obj, которое все еще равно null (поскольку оно не является частью инициализированных переменных кучи и конструктора).
    7. Когда конструктор завершит работу, выполните следующий статический инициализатор, который устанавливает obj в новый экземпляр Object.
  4. Инициализация класса выполнена. С этого момента все вызовы конструктора будут вести себя так, как вы предполагаете / ожидаете, то есть obj будет не null, а ссылкой на экземпляр Object.

Помните, что Java указывает, что переменной final присваивается значение один раз. Дело не в том, что ему гарантируется присвоение значения, когда код ссылается на него, если только вы не убедитесь, что код ссылается на него после того, как оно назначено.

Это не ошибка. Это определенный способ обработки использования класса во время его собственной инициализации. Если бы это было не так, то JVM пошла бы в бесконечный цикл. См. Шаг № 3.3 (если JVM не пропускает инициализацию для класса, который находится в процессе инициализации, он просто продолжит инициализировать его - бесконечный цикл).

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

15
задан Rich Apodaca 20 May 2009 в 18:51
поделиться

1 ответ

Существует метод защищенного экземпляра с именем collection_path, который вы можете переопределить.

class Employee < ActiveResource::Base
  self.site = "http://example.com"

  def collection_path(options = nil)
    "/companies/#{prefix_options[:company_id]}/#{self.class.collection_name}"
  end
end

После этого вы сможете создать сотрудников.

e = Employee.new(:name => "Corey")
e.prefix_options[:company_id] = 1
e.save

Не похоже, что prefix_options задокументирован кроме метода клонирования, так что это может измениться в будущих выпусках.

10
ответ дан 1 December 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: