jruby include производительность класса java против пакета - PullRequest
0 голосов
/ 14 января 2010

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

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

В консоли, для , например, 1 , когда я говорю MyMod :: и нажимаем вкладку, он имеет (например) 101 метод и параметры класса, в том числе MyMod :: MyClass.

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

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

Пример кода:

пример 1

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

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

module MyMod
  include_package "my.package"
end

Ответы [ 2 ]

1 голос
/ 15 января 2010

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

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

0 голосов
/ 15 января 2010

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

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*

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

...