Funktionel programmering i Clojure og backendudvikling på JVM · Lektion

Implementering af Java-interfaces

Lær at oprette Clojure-implementeringer af Java-interfaces, så De opnår problemfri integration med Java-API'er.

Lektion 2 af 411 trin

Implementering af Java-interfaces er en gratis Funktionel programmering i Clojure og backendudvikling på JVM-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Funktionel programmering i Clojure og backendudvikling på JVM, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Funktionel programmering i Clojure og backendudvikling på JVM-kurset indeholder 4 lektioner i alt.

Brobygning mellem Java og Clojure

Clojure kører på Java Virtual Machine (JVM), hvilket betyder, at det kan interagere med Java-kode. Denne stærke funktion kaldes Java-interoperabilitet.

Mange Java-biblioteker og API'er forventer, at du leverer objekter, der implementerer bestemte Java-grænseflader. Denne lektion lærer dig, hvordan Clojure hjælper dig med uden besvær at opfylde disse forventninger.

Hvad er en Java-grænseflade?

En Java-grænseflade fungerer som en kontrakt eller en skabelon for en klasse. Den definerer et sæt metoder, som en klasse skal implementere, hvis den hævder at følge denne grænseflade.

  • Grænseflader erklærer metodesignaturer (navn, argumenter, returtype), men indeholder ingen implementering.
  • De muliggør polymorfi, så forskellige klasser kan behandles ensartet, hvis de implementerer den samme grænseflade.
  • De er afgørende for callback-mekanismer og API-udvidelsesmuligheder i Java.

Clojures `reify`-makro

Clojure tilbyder makroen reify til dynamisk at oprette anonyme implementeringer af Java-grænseflader (eller endda konkrete klasser). Det er dit primære værktøj til at opfylde kontrakter for Java-grænseflader.

Tænk på reify som Clojures måde at sige: "Her er et objekt, der opfører sig, som om det implementerer denne Java-grænseflade, med denne specifikke adfærd for sine metoder."

Grundlæggende syntaks for `reify`

Den grundlæggende syntaks for reify ser sådan ud:

(reify InterfaceName (method-name [this arg1 arg2] body))

  • InterfaceName: Det fulde navn på den Java-grænseflade, du implementerer (f.eks. java.lang.Runnable).
  • method-name: En metode, der er defineret i grænsefladen.
  • [this arg1 arg2]: Metodens argumenter. this henviser til selve det oprettede objekt.
  • body: Den Clojure-kode, der implementerer metodens adfærd.

Eksempel: Implementering af `Runnable`

Grænsefladen java.lang.Runnable er en simpel Java-grænseflade med én metode, run(), som ikke tager nogen argumenter og ikke returnerer noget. Den bruges ofte til opgaver, der kan udføres af en tråd.

Lad os bruge reify til at oprette en Runnable-instans og køre den.

(defn -main []
  (let [my-task (reify java.lang.Runnable
                          (run [this]
                            (println "Hello from Clojure's Runnable!")))]
    (println "Creating a Java Thread...")
    (doto (Thread. my-task)
          (.start)
          (.join)) ; Wait for the thread to finish
    (println "Thread execution complete.")))

Forstå argumentet `this`

Du har måske lagt mærke til argumentet this i metodesignaturen (f.eks. [this] eller [this name]). Dette argument henviser til instansen af den anonyme klasse, der genereres af reify.

Selvom det er mindre almindeligt i funktionel Clojure, kan du bruge this til at kalde andre metoder, der er defineret på det samme reified-objekt, eller få adgang til dets interne tilstand, hvis den var foranderlig (hvilket vi generelt undgår i Clojure).

Implementering af flere grænseflader

reify er ikke begrænset til én grænseflade! Du kan implementere flere Java-grænseflader med ét reify-udtryk. Du skal blot angive alle de grænseflader, du vil implementere, før du definerer deres metoder.

Syntaksen udvides sådan:

(reify Interface1 Interface2 (method1) (method2) ...)

Eksempel: Flere grænseflader

Her implementerer vi både java.lang.Runnable og java.util.concurrent.Callable. Metoden call() i Callable returnerer en værdi, modsat run() i Runnable.

Vi bruger future til at udføre Callable asynkront.

(defn -main []
  (let [multi-task (reify java.lang.Runnable
                                  java.util.concurrent.Callable
                             (run [this]
                               (println "Runnable part: Executing!"))
                             (call [this]
                               (println "Callable part: Calculating...")
                               (Thread/sleep 100) ; Simulate work
                               "Clojure's Result"))]
    (println "Running task...")
    (.run multi-task) ; Call Runnable's run method

    (println "Submitting Callable...")
    (let [f (future (.call multi-task))] ; Execute Callable in a future
      (println (str "Future result: " @f))) ; Dereference future to get result
    (println "Done."))

Tilsidesættelse af `Object`-metoder

Når du bruger reify, udvider det objekt, du opretter, implicit java.lang.Object. Det betyder, at du også kan tilsidesætte metoder fra Object, såsom toString, equals eller hashCode.

Det er nyttigt, når du vil angive brugerdefinerede repræsentationer eller lighedssemantik for dine reified-objekter, især når de kan blive brugt i Java-samlinger eller logget.

(defn -main []
  (let [my-custom-obj (reify Object
                               (toString [this]
                                 "I am a custom Clojure object with a special string representation!"))]
    (println "My object:" my-custom-obj)
    (println "Type of object:" (class my-custom-obj))))

Hurtigt tjek af `reify`

Test din forståelse af Clojures makro reify.

Opsummering: Implementering af Java-grænseflader

I denne lektion lærte du, hvordan du forbinder Clojure og Java ved at implementere Java-grænseflader med makroen reify.

  • Java-grænseflader definerer kontrakter for adfærd.
  • reify opretter anonyme objekter, der opfylder disse kontrakter.
  • Du kan implementere én eller flere grænseflader og endda tilsidesætte Object-metoder.
  • Denne funktion er afgørende for at integrere Clojure med det omfattende Java-økosystem.

Derefter skal du se på, hvordan du udnytter det omfattende Java-biblioteksøkosystem i dine Clojure-projekter.

Gratis at komme i gang

Lær Clojure med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Implementering af Java-interfaces” gratis?

Ja — hele teksten til “Implementering af Java-interfaces” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Funktionel programmering i Clojure og backendudvikling på JVM-kurset, skal du opgradere til CoddyKit PRO. Funktionel programmering i Clojure og backendudvikling på JVM-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Implementering af Java-interfaces”?

Lær at oprette Clojure-implementeringer af Java-interfaces, så De opnår problemfri integration med Java-API'er. Du øver dig i Funktionel programmering i Clojure og backendudvikling på JVM med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Funktionel programmering i Clojure og backendudvikling på JVM?

Der kræves ingen tidligere erfaring. Funktionel programmering i Clojure og backendudvikling på JVM på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Implementering af Java-interfaces”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Funktionel programmering i Clojure og backendudvikling på JVM-lektion?

Ja. Alle Funktionel programmering i Clojure og backendudvikling på JVM-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Kald af Java fra Clojure
  2. Implementering af Java-interfaces
  3. Udnyttelse af Java-biblioteker og -værktøjer
  4. Arbejde med Java-samlinger og arrays
← Tilbage til Funktionel programmering i Clojure og backendudvikling på JVM