Давайте попробуем по-другому объяснить это ...
Это последовательность, которую JVM проходит, когда вы впервые ссылаетесь на класс MyClass
.
static { ... }
. myClass
новым экземпляром MyClass
. MyClass
уже загружен (байт-код) и находится в процессе инициализации , поэтому пропускает инициализацию. obj
, которое все еще равно null
(поскольку оно не является частью инициализированных переменных кучи и конструктора). obj
в новый экземпляр Object
. obj
будет не null
, а ссылкой на экземпляр Object
. Помните, что Java указывает, что переменной final
присваивается значение один раз. Дело не в том, что ему гарантируется присвоение значения, когда код ссылается на него, если только вы не убедитесь, что код ссылается на него после того, как оно назначено.
Это не ошибка. Это определенный способ обработки использования класса во время его собственной инициализации. Если бы это было не так, то JVM пошла бы в бесконечный цикл. См. Шаг № 3.3 (если JVM не пропускает инициализацию для класса, который находится в процессе инициализации, он просто продолжит инициализировать его - бесконечный цикл).
Обратите внимание, что все это происходит в том же потоке, который сначала ссылается на класс. Во-вторых, JVM гарантирует, что инициализация будет завершена до того, как любой другой поток сможет использовать этот класс.
Существует метод защищенного экземпляра с именем 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 задокументирован кроме метода клонирования, так что это может измениться в будущих выпусках.