2010-01-14 1 views
0

У меня есть приложение для jruby rails с модулем ruby ​​в lib, который меняет имена моих объектов Java, поэтому у меня нет конфликтов.jruby включает в себя производительность класса java vs include package

Мне интересно, какая разница между включением определенных классов в этот модуль и включая пакет. Я привел пример кода ниже.

В консоли для пример 1, когда я говорю «MyMod ::» и «hit tab», он имеет (например) 101 метод и параметры класса с MyMod :: MyClass является одним из них.

Для пример 2, когда я ударил MyMod :: и tab, у него есть только 100 вариантов метода/класса, и он не содержит MyClass. Если я затем перейду и ссылаюсь на MyMod :: MyClass, а затем запустите эту вкладку MyMod ::, теперь у меня есть 101 вариант, а MyClass указан.

Вот мой вопрос. В чем разница между ссылками на эти классы сразу в моем модуле à la пример 1 против наличия нагрузки по запросу, например пример 2. Если у меня есть пакет с около 20 классов, которые я использую, является она предпочитает, чтобы они загружены по требованию или спереди, и есть ли накладные расходы на загрузку этого по требованию, а-ля примера 2

Пример кода :

пример 1

module MyMod 
    MyClass = Java::my.package.MyClass 
    .... 
end 

против пример 2

module MyMod 
    include_package "my.package" 
end 

ответ

1

Если вы действительно собираетесь использовать класс, это будет стоить вам что-то в какой-то момент. Не имеет значения, загрузите его по отдельности или по запросу. Я думаю, что для ваших 2 примеров, если вы используете MyClass, тогда нет никакой разницы. С другой стороны, если MyClass никогда не используется, то пример 1 явно растрачивает что-то.

Кроме того, include_package на самом деле не тянет весь пакет, но вроде как создать область поиска при необходимости класса. Как правило, не рекомендуется использовать include_package. См. JRUBY-2376 о проблемах, которые он имеет.

+0

Огромное спасибо. Я действительно не расширяю или не переопределяю какой-либо java-код в своем рубине, что, по-видимому, относится к этой ошибке, я буквально просто включаю пакеты, поэтому я могу ссылаться на них, но хорошо знать. – brad

0

У меня есть несколько разные результаты. Возможно, вы используете другой автокомплект?

irb(main):001:0> module MyMod;MyClass = Java::JavaUtil::Date;end 
=> Java::JavaUtil::Date 
irb(main):002:0> module OtherMod;include_package "Java.Util";end 
=> nil 
irb(main):003:0> MyMod.methods.size 
=> 109 
irb(main):004:0> OtherMod.methods.size 
=> 109 
irb(main):005:0> require 'irb/completion' 
=> true 
irb(main):006:0> MyMod:: 
Display all 110 possibilities? (y or n) 
irb(main):006:0> OtherMod:: 
Display all 109 possibilities? (y or n) 
irb(main):006:0> OtherMod:: 
irb(main):007:0* 

Что касается вашего вопроса, я не знаю точно. Но если бы я должен был догадаться, я бы сказал, что, поскольку рубин динамичен, ни один подход не загружает ничего впереди.

+0

Я использую консоль рельсов. Я просто попробовал ваш пример с двумя файлами rb, созданными для вашей спецификации с теми же результатами, однако методы, похоже, не перечисляют доступные классы для этого модуля. Вот некоторые из вывода моей консоли >> MyMod.methods.size => 161 >> OtherMod.methods.size => 161 >> MyMod :: Показать все 162 возможности? (y или n) >> OtherMod :: Показать все 161 возможностей? (y или n) – brad

+0

oops ...который не форматирует слишком хорошо, я думаю, что вы его получите, хотя >> очевидно, консольная подсказка – brad