Java Academy · leksjon

Metodereferanser til instansmetoder på en bestemt instans

Fang en bestemt objektinstans og referer til en av instansmetodene dens for tilbakekall og lyttere.

Leksjon 2 av 413 trinn

Metodereferanser til instansmetoder på en bestemt instans er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Referanse til en spesifikk instans

En instansmetodereferanse til en spesifikk instans fanger opp et bestemt objekt og refererer til en av metodene i objektet. Syntaks: instance::methodName.

// System.out is a specific PrintStream instance
List<String> names = List.of("Alice","Bob","Carol");
names.forEach(System.out::println); // System.out is the captured instance

Fange opp en egendefinert objektinstans

Hvilket som helst objekt kan fanges opp. Metodereferansen bruker instansen som eksisterer når den opprettes:

class Greeter {
    private String prefix;
    Greeter(String prefix) { this.prefix = prefix; }
    String greet(String name) { return prefix + ", " + name + "!"; }
}

Greeter g = new Greeter("Hello");
java.util.function.Function<String, String> greetFn = g::greet;

System.out.println(greetFn.apply("Alice")); // Hello, Alice!
System.out.println(greetFn.apply("Bob"));   // Hello, Bob!

Bruke som Supplier

En instansmetode uten argumenter, bundet til et bestemt objekt, samsvarer med Supplier<T>:

StringBuilder sb = new StringBuilder("Hello World");
java.util.function.Supplier<String> toString = sb::toString;

System.out.println(toString.get()); // Hello World
sb.append(" !");
System.out.println(toString.get()); // Hello World ! (sb is live)

Bruke som Predicate

Instansmetoder som returnerer en boolsk verdi, samsvarer med Predicate når de er bundet til en bestemt instans:

String prefix = "Java";
java.util.function.Predicate<String> startsWith = prefix::equals;
// Hmm, this checks if prefix.equals(candidate).
// More useful:
Predicate<String> startsWithJ = s -> s.startsWith("J");

// But a specific instance Predicate:
StringBuilder pattern = new StringBuilder("hello");
Predicate<String> equalsHello = ((CharSequence)"hello")::equals;
System.out.println(equalsHello.test("hello")); // true
System.out.println(equalsHello.test("world")); // false

Mønster for lytter og callback

Metodereferanser til spesifikke instanser passer utmerket for hendelseslyttere og callback-funksjoner – de fanger naturlig opp handler-objektet:

class EventHandler {
    void onEvent(String event) {
        System.out.println("Handling: " + event);
    }
}

EventHandler handler = new EventHandler();
List<String> events = List.of("click","hover","submit");
events.forEach(handler::onEvent); // captures the specific handler instance

Praktisk: Logger bundet til en klasse

Bind en logger til en spesifikk loggerinstans for bruk som en Consumer:

import java.util.logging.*;

Logger log = Logger.getLogger("MyApp");

List<String> messages = List.of("Starting","Processing","Done");
messages.stream()
    .map(String::toUpperCase)
    .forEach(log::info); // log is the specific Logger instance

Referansen fanger tilstanden ved bindingstidspunktet

Objekttilstanden som er synlig gjennom referansen, gjenspeiler objektets aktive tilstand, ikke et øyeblikksbilde fra da referansen ble opprettet:

List<String> list = new ArrayList<>(List.of("A","B"));
java.util.function.Supplier<Integer> sizeRef = list::size;

System.out.println(sizeRef.get()); // 2
list.add("C");
System.out.println(sizeRef.get()); // 3 (reflects live state)

Sammenligning av spesifikk og vilkårlig instans

To ulike former for metodereferanser ser like ut – forstå forskjellen:

// Specific instance: s is captured at binding
String s = "hello";
Predicate<String> p1 = s::equalsIgnoreCase; // String::equalsIgnoreCase bound to 'hello'

// Arbitrary instance: receiver is the stream element
Function<String, String> p2 = String::toUpperCase; // receiver IS the element

Bruksområde: Trådsikker delegering av metoder

Bind en synkronisert metode på et tjenesteobjekt som et funksjonelt grensesnitt for trygg asynkron bruk:

class Counter {
    private int count = 0;
    synchronized void increment(String ignored) { count++; }
    int get() { return count; }
}

Counter c = new Counter();
List<String> tasks = List.of("t1","t2","t3");
tasks.forEach(c::increment);
System.out.println(c.get()); // 3

Når den fangede instansen er null

Hvis det fangede objektet er null når metodereferansen opprettes, utløses en NullPointerException ved kall, ikke ved binding:

StringBuilder sb = null;
// Reference is created without error:
java.util.function.Supplier<String> ref = sb::toString;
try {
    ref.get(); // NPE thrown here
} catch (NullPointerException e) {
    System.out.println("NPE at invocation");
}

Sammenligningssammendrag

Tre former for metodereferanser sammenlignet:

  • ClassName::staticMethod – statisk, uten mottaker
  • instance::instanceMethod – bundet til et spesifikt objekt
  • ClassName::instanceMethod – mottakeren er strømelementet (vilkårlig instans)

Hurtigsjekk

Gitt EventHandler h = new EventHandler(); list.forEach(h::handle); – hva er mottakeren for handle-kallet for hvert element?

Oppsummering: Metodereferanser til spesifikke instanser

Viktigste punkter:

  • Syntaks: instance::methodName – fanger et spesifikt objekt
  • Det fangede objektet er mottakeren ved hvert kall
  • Ideelt for tilbakekall, lyttere og loggingsmønstre
  • Den fangede instansens aktive tilstand er synlig gjennom referansen
  • NPE ved kall hvis instansen er null (ikke ved binding)
Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Metodereferanser til instansmetoder på en bestemt instans» gratis?

Ja – hele teksten i «Metodereferanser til instansmetoder på en bestemt instans» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Metodereferanser til instansmetoder på en bestemt instans»?

Fang en bestemt objektinstans og referer til en av instansmetodene dens for tilbakekall og lyttere. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Metodereferanser til instansmetoder på en bestemt instans»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Referanser til statiske metoder
  2. Metodereferanser til instansmetoder på en bestemt instans
  3. Metodereferanser til vilkårlige instanser
  4. Konstruktørreferanser
← Tilbake til Java Academy