Clojure - Interfaccia Java

Come già sappiamo, alla fine il codice Clojure viene eseguito sull'ambiente virtuale Java. Quindi ha senso solo che Clojure sia in grado di utilizzare tutte le funzionalità di Java. In questo capitolo, discutiamo la correlazione tra Clojure e Java.

Richiamo di metodi Java

I metodi Java possono essere chiamati utilizzando la notazione punto. Un esempio sono le stringhe. Poiché tutte le stringhe in Clojure sono comunque stringhe Java, è possibile chiamare i normali metodi Java sulle stringhe.

Un esempio di come questo viene fatto è mostrato nel seguente programma.

Esempio

(ns Project
   (:gen-class))
(defn Example []
   (println (.toUpperCase "Hello World")))
(Example)

Il programma precedente produce il seguente output. Puoi vedere dal codice che se chiami solo la notazione punto per qualsiasi metodo di stringa, funzionerà anche in Clojure.

Produzione

HELLO WORLD

Richiamo di metodi Java con parametri

È inoltre possibile chiamare metodi Java con parametri. Un esempio di come questo viene fatto è mostrato nel seguente programma.

Esempio

(ns Project
   (:gen-class))
(defn Example []
   (println (.indexOf "Hello World","e")))
(Example)

Il programma precedente produce il seguente output. Puoi vedere dal codice sopra, che stiamo passando il parametro "e" al metodo indexOf. Il programma precedente produce il seguente output.

Produzione

1

Creazione di oggetti Java

Gli oggetti possono essere creati in Clojure utilizzando la parola chiave "new" simile a quanto fatto in Java.

Un esempio di come questo viene fatto è mostrato nel seguente programma.

Esempio

(ns Project
   (:gen-class))
(defn Example []
   (def str1 (new String "Hello"))
   (println str1))
(Example)

Il programma precedente produce il seguente output. Puoi vedere dal codice sopra, che possiamo usare la parola chiave 'new' per creare un nuovo oggetto dalla classe String esistente da Java. Possiamo passare il valore durante la creazione dell'oggetto, proprio come facciamo in Java. Il programma precedente produce il seguente output.

Produzione

Hello

Di seguito è riportato un altro esempio che mostra come possiamo creare un oggetto della classe Integer e usarli nei normali comandi Clojure.

Esempio

(ns Project
   (:gen-class))
(defn Example []
   (def my-int(new Integer 1))
   (println (+ 2 my-int)))
(Example)

Il programma precedente produce il seguente output.

Produzione

3

Importa comando

Possiamo anche utilizzare il comando import per includere le librerie Java nello spazio dei nomi in modo che sia possibile accedere facilmente alle classi e ai metodi.

L'esempio seguente mostra come possiamo usare il comando import. Nell'esempio stiamo usando il comando import per importare le classi dal filejava.util.stackbiblioteca. Possiamo quindi utilizzare il metodo push e pop della classe stack così come sono.

Esempio

(ns Project
   (:gen-class))
(import java.util.Stack)
(defn Example []
   (let [stack (Stack.)]
   (.push stack "First Element")
   (.push stack "Second Element")
   (println (first stack))))
(Example)

Il programma precedente produce il seguente output.

Produzione

First Element

Codice in esecuzione utilizzando il comando Java

Il codice Clojure può essere eseguito utilizzando il comando Java. Di seguito è riportata la sintassi di come eseguire questa operazione.

java -jar clojure-1.2.0.jar -i main.clj

Devi menzionare il file jar Clojure, in modo che tutte le classi basate su Clojure vengano caricate nella JVM. Il file "main.clj" è il file di codice Clojure che deve essere eseguito.

Funzioni integrate di Java

Clojure può utilizzare molte delle funzioni integrate di Java. Alcuni di loro sono -

Math PI function- Clojure può utilizzare il metodo Math al valore di PI. Di seguito è riportato un codice di esempio.

Esempio

(ns Project
   (:gen-class))
(defn Example []
   (println (. Math PI)))
(Example)

Il codice precedente produce il seguente output.

Produzione

3.141592653589793

System Properties- Clojure può anche interrogare le proprietà del sistema. Di seguito è riportato un codice di esempio.

Esempio

(ns Project
   (:gen-class))
(defn Example []
   (println (.. System getProperties (get "java.version"))))
(Example)

A seconda della versione di Java sul sistema, verrà visualizzato il valore corrispondente. Di seguito è riportato un esempio di output.

Produzione

1.8.0_45