Методы с внешним кодом (Java) - PullRequest
3 голосов
/ 04 марта 2012

В настоящее время я работаю над графическим API Java и хочу включить простую настройку.Частью того, что я имею в виду, является возможность заменить стандартный код собственным кодом.Чтобы добиться этого, мне интересно, могу ли я иметь методы моего кода ссылочного кода во внешних, заменяемых файлах (которые могут быть написаны или не написаны на другом языке, например RhinoScript).Например, если кто-то, использующий API, считает, что код конкретного метода неэффективен, он может заменить файл, на который ссылается метод, своим собственным файлом с кодом, который он считает более эффективным.

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

Суть в том, что я спрашиваю, такова: возможно ли иметь метод выполнения кода, содержащийся в отдельном файле (содержит только код, который будет выполнять метод), который может быть или не быть записан вязык, отдельный от Java, и если да, то как мне поступить в этом направлении или какие предметы мне следует исследовать для этого?

В заключение я прошу прощения, если это неприемлемый вопрос на этом форуме или яне сформулировали мой вопрос достаточно четко.

Ответы [ 3 ]

2 голосов
/ 04 марта 2012

Я думаю, что это не тот путь, если вы хотите предложить настройку для своей библиотеки, интерфейсы и абстрактные классы - ваш лучший выбор.Реализация оболочек для других языков будет очень неэффективной и, вероятно, относительно медленной, даже не начиная со сложности, которую она добавляет к вашему коду.Как вы собираетесь передавать аргументы?Получать возвращаемые значения?Управлять исключениями в случае ошибок времени выполнения или синтаксиса?

Конечно, все это возможно, но как разработчик, я бы никогда не использовал API, который работает так, как вы описали.

0 голосов
/ 04 марта 2012

То, что вы просите сделать, звучит так же, как то, что Reflection A.P.I. можем предложить:

Возможности расширения

Приложение может использовать внешние пользовательские классы, создавая экземпляры объектов расширяемости, используя их полностью определенные имена.

Подробнее об этом читайте здесь:

http://docs.oracle.com/javase/tutorial/reflect/

0 голосов
/ 04 марта 2012

Обычно я бы предложил один из следующих методов:

  • Определите интерфейс , необходимый для реализации пользовательского кода
  • Укажите (возможно, абстрактный) базовый класс , который пользовательский код может расширять с помощью наследования

Какой из них вы выберете, зависит от вас, обычно базовые классы немного проще для использования людьми (поскольку им нужно только переопределить конкретные методы, которые они хотят изменить), тогда как интерфейсы дают вам лучшую абстракцию и могут быть немного более гибкий / обслуживаемый в долгосрочной перспективе.

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

Если вы действительно хотите разрешить расширение в другом языке, я все же думаю, что интерфейс / базовые классы - это путь: многие другие языки JVM позволяют расширять класс Java или реализовывать интерфейс. Затем вы оставляете за пользователем возможность генерировать любой код по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...