Правильный синтаксис jruby для требования java и включая классы Java

99
11

Я не могу найти, что текущий синтаксис для использования java-классов в Jruby.
Этот текст ссылки:


include Java
include 'java'
require 'java'

В качестве допустимых параметров, хотя он говорит, что последний вариант - до 1.0 и не работает.
Jruby Wiki, однако, говорит, чтобы использовать require 'java'


И для включения классов, которые я видел


MyClass = Java::some.package.MyClass
include_class Java::some.package.MyClass
include_class 'some.package.MyClass'
java_import Java::some.package.MyClass

Есть ли один предпочтительный метод?


В настоящее время я получаю сообщение "переопределить X", так как у меня есть несколько классов java, которые совпадают с моим классом ruby. Какой лучший метод для хранения пространства имен java, поэтому я не получаю их, и есть ли какие-либо проблемы (помимо очевидного класса Java, предшествующего классу ruby) с этим переопределением, если я никогда не буду использовать два класса ruby ​​/java в тот же файл?

спросил(а) 2021-01-25T18:07:30+03:00 5 месяцев назад
1
Решение
63

Я предпочитаю


require 'java'
java_import java.lang.System

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

Для конфликта имен между классами Java и JRuby. Для удобства чтения кода или для целей обслуживания я предлагаю избегать использования одного и того же имени для двух разных классов, если вы не хотите его повторно открыть.


Обновить: вы уверены, что ошибка "Redefine X..." вызвана тем же именем для вашего класса Java и JRuby? Я обычно получаю эту ошибку, потому что я java_import тот же самый класс Java несколько раз (иногда в разных местах, иногда я загружаю один и тот же файл несколько раз).

ответил(а) 2021-01-25T18:07:30+03:00 5 месяцев назад
62

Лично я всегда использую require 'java'


Если у вас возникли конфликты пространства имен, я бы предложил не включать или импортировать, но указывать полностью квалифицированные имена классов, например.

my_instance = Java::JavaUtil::Date.new


... где Java:: - модуль верхнего уровня для всех классов java, JavaUtil:: - это полное имя пакета для класса, который я хочу, в надлежащем случае и застрял вместе, а Date - это фактическое имя класса.

ответил(а) 2021-01-25T18:07:30+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема