Добавить конструктор для определения типа созданного класса

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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

Я бы предложил просто написать объект в Java - для Java-подобных объектов с изменяемыми полями он, вероятно, будет более изящным, понятным и практичным.

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

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