4

Я новичок в clojure и хотел бы взаимодействовать с java-объектами, используя clojure. Если я хорошо понял, можно достичь этого взаимодействия, используя defprotocol. Что конкретно попытаться сделать следующее:Манипулирование java-объектами из clojure

1- я следующий класс Java

package mytestspackage; 

public class TestObject { 

    private String lastName; 
    private String firstName; 
    private String age; 

    public TestObject(String lastName, String firstname, String age) { 
     super(); 
     this.lastName = lastName; 
     this.firstName = firstname; 
     this.age = age; 
    } 

    public String getName() { 
     return this.lastName; 
    } 

    public void setName(String name) { 
     this.lastName = name; 
    } 

    public String getFirstname() { 
     return this.firstName; 
    } 

    public void setFirstname(String vorname) { 
     this.firstName = vorname; 
    } 

    public String getAge() { 
     return this.age; 
    } 

    public void setAge(String age) { 
     this.age = age; 
    } 

} 

2- я создать протокол Clojure, который должен позволить мне получить доступ к экземплярам выше класса Java TestObject

(ns mytestspackage) 
(defprotocol Test 
    (first-name [t]) 
    (last-name [t]) 
    (age [t])) 

Теперь мой вопрос: где я concretly реализовать методы, определенные в протоколе и как я могу использовать эту реализацию, чтобы передать экземпляры TestObject в сторону Clojure и доступ к значениям, как фамилия, имя и т.д. ...

Любая помощь будет оценена. Спасибо заранее.

С уважением, Гораций

ответ

3

Если я хорошо понял, можно достичь этого взаимодействия, используя defprotocol.

Нет, у вас есть это неправильно. Протоколы предназначены для того, чтобы позволить вещам, аналогичным тому, что позволяет интерфейс в простой Java (хотя и более мощный). Вы можете получить доступ к вашему классу Java без каких-либо протоколов. Официальная документация Clojure по этой теме: http://clojure.org/java_interop

Пример:

(ns example 
    (:import mytestpackage.TestObject)) 

;; This is how we call methods on java objects  

(defn first-name [obj] 
    (.getFirstname obj)) 

(defn last-name [obj] 
    (.getName obj)) 

(defn age [obj] 
    (.getAge obj)) 

(defn set-first-name [obj name] 
    (.setFirstname obj name)) 

(defn set-last-name [obj name] 
    (.setName obj name)) 

(defn set-age [obj age] 
    (.setAge obj age)) 

;; In REPL 

example => (let [x (TestObject. nil nil nil)  ;; This is how we create Java objects 
       x (new TestObject nil nil nil)] ;; These expressions are equivalent 
       (println (first-name x)) 
       (set-first-name x "Name") 
       (println (first-name x)) 
       (set-last-name x "Last name") 
       (set-age x "23") 
       (println (last-name x)) 
       (println (age x))) 
;; Outputs 
nil 
Name 
Last name 
23 

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

1

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

Например строки в Clojure является java.lang.String объектов:

user=> (type "Really a Java String") 
;; java.lang.String 

user=> (.toUpperCase "Really a java string") 
;;=> "REALLY A JAVA STRING" 

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

user=> (def a-test-object (mytestpackage/TestObject. "lastName" "firstName" 42)) 

и вызывать методы например:

user=> (.getAge a-test-object) 

См. http://clojure.org/java_interop для получения дополнительной информации.

 Смежные вопросы

  • Нет связанных вопросов^_^