Добавить конструктор в deftype созданный класс - PullRequest
11 голосов
/ 29 июня 2011

Для целей взаимодействия с Java мне нужен класс с нулевым конструктором, который выполняет инициализацию. У объектов этого класса должно быть что-то, напоминающее изменяемые поля Java (а именно, объект представляет бэкэнд игры и должен сохранять игровое состояние).

deftype делает все Я хочу сделать , за исключением обеспечения нулевого конструктора (так как я создаю класс с полями).

Мне не нужно, чтобы поля были общедоступными, поэтому я могу придумать 4 решения:

Использовать gen-класс; Я не хочу этого делать, если смогу избежать этого.
Каким-то образом кодировать закрытые переменные-члены вне знания deftype; Мне сказали, что это невозможно сделать.
Написание модифицированного deftype, который также создает нулевой конструктор; честно говоря, я недостаточно хорошо знаю clojure для этого.
Взятие класса, созданного deftype, и добавление в него нового конструктора.

В конце этого мне нужен класс Java, так как я передам его Java-коду, который будет создавать новый объект из класса.

Является ли какое-либо из предложенных мною решений (или какое-либо, о котором я не задумывался) кроме использования gen-class жизнеспособным?

Ответы [ 2 ]

3 голосов
/ 30 июня 2011

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

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

В любом случае, ни deftype, ни defrecord не предназначены (и не будут ли они) полнофункциональными средствами взаимодействия.gen-class определенно подходит ближе всего, поэтому его рекомендовали.

2 голосов
/ 01 июля 2011

Я бы предложил просто написать объект на Java - для Java-подобных объектов с изменяемыми полями это, вероятно, будет более элегантным, понятным и практичным.Clojure код в проектах.Это похоже на один из тех случаев, когда это может быть уместно.Функциональная совместимость настолько хороша, что у вас практически нет дополнительных сложностей.

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

...