Clojure/ინტეგრაცია ჯავასთან

ვიკიწიგნებიდან
Jump to navigation Jump to search

Clojure-ს აქვს საშუელაბე გამოიყენოს ჯავას ობიექტები და პრიმიტივები. ამის ცოდნა აუცილებელია რთული პროგრამების დასაწერად.

მოდით დავიწყოთ ჯავას java.util.Date ობიექტის შექმნით:

user=> (new java.util.Date)
Mon May 26 10:25:25 PDT 2008

Clojure ქმნის java.util.Date ობიექტს, შემდეგ იძახებს მის toString() მეთოდს, ამ ობიექტის ვიზუალურად წარმოდგენისთვის.

ობიექტის კონსტრუქტორში არგუმენტების გადასაცემად, უბრალოდ ჩართეთ ისინი new გამოძახებაში:

user=> (new StringBuffer "This is the initial value")
This is the initial value

ობიექტის მეთოდის გამოძახებისთვის გამოიყენეთ წერტილის (.) ფორმა:

user=> (. (new java.util.Date) (toString))
"Mon May 26 11:12:15 PDT 2008"

წერტილის ფორმა იყენებს წერტილის სიმბოლოს (.), როგორც ოპერატორს. მეორე არგუმენტია ობიექტი, რომლის მეთოდი უნდა გამოვიძახოთ. მესამე არგუემნტი არის სია, რომელიც შეიცავს მეთოდის სახელს და, თუ საჭიროა, მეთოდის არგუმენტებს:

user=> (. (new java.util.HashMap) (containsKey "key"))  
false

სტატიკური მეთოდები შესაძლებელია იგივე გზით გამოვიძახოთ:

user=> (. Boolean (valueOf "true"))
true

კლასის და ეგზემპლარის ველებიც იგივენაირად გამოიძახება:

user=> (. Integer MAX_VALUE)
2147483647

user=> (. Character TYPE)
char
</code>

(წარმატებას გისურვებთ, სტანდარტულ ჯავა ბიბლიოთეკაში ეგზემპლარის <code>public</code> ველის პოვნაში :)

განსხვავება აქ ისაა, რომ ველის სახელი არ არის მოქცეული ფრჩხილებში.

ისევე როგორც ჯავა პროგრამაში, Clojure გაძლევთ საშუალებას კლასების იმპორტირების მოცემულ კონტექსტში, ასე რომ კლასის გამოძახებისას არ იქნება საჭირო მათი სრული სახელის დაწერა:

<source lang="bash">
user=> (import '(java.io FileReader))
nil

user=> (new FileReader "source.txt")
java.io.FileReader@f784d7

იგივე კოდის შემოკლებული ვერსიაც არსებობს:

user=> (import '(java.io FileReader))
nil

user=> (FileReader. "source.txt")
java.io.FileReader@f784d7

ერთი პაკეტიდან რამოდენიმე კლასის იმპორტირება ასე ხდება:

user=> (import '(java.io File FileReader))
nil

ზედა მაგალითში მოხდა როგორც File, ასევე FileReader კლასების იმპორტირება.

თუ კლასები განსხვავებულ პაკეტებშია, გამოიყენეთ ასეთი სინტაქსი:

user=> (import '(java.io File) '(java.util HashMap))
nil

ან შეგიძლიათ ორი განცალკევებული import გამოსახულების გამოყენება:

user=> (import '(java.io File))
nil

user=> (import '(java.util HashMap))
nil