Referencer til instansmetoder på en bestemt instans
Indfang et bestemt objekt, og referér til en af dets instansmetoder til callbacks og lyttere.
Referencer til instansmetoder på en bestemt instans er en gratis Java Academy-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 Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Reference til en specifik instans
En metodereference til en instansmetode på en specifik instans fanger et bestemt objekt og refererer til en af dets metoder. 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 instanceIndfangning af en brugerdefineret objektinstans
Du kan indfange et vilkårligt objekt. Metodereferencen bruger instansen på det tidspunkt, hvor den oprettes:
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!Brug som Supplier
En instansmetode uden argumenter, der er bundet til et bestemt objekt, passer til 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)Brug som Predicate
Instansmetoder, der returnerer en boolsk værdi, passer til 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")); // falseLytter-/callback-mønster
Metodereferencer til specifikke instanser er ideelle til hændelseslyttere og callbacks — de fanger naturligt håndteringsobjektet:
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 instancePraktisk: Logger bundet til en klasse
Knyt en logger til en bestemt loggerinstans, så den kan bruges 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 instanceReferencen indfanger tilstanden på bindingstidspunktet
Den objekttilstand, der er synlig via referencen, afspejler objektets aktive tilstand, ikke et øjebliksbillede fra det tidspunkt, hvor referencen blev oprettet:
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 af specifik og vilkårlig instans
To forskellige former for metodereferencer ligner hinanden — forstå forskellen:
// 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 elementAnvendelse: Trådsikker delegering af metoder
Knyt en synkroniseret metode på et serviceobjekt til en funktionel grænseflade, så den kan bruges sikkert asynkront:
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()); // 3Når den indfangede instans er null
Hvis det indfangede objekt er null, når metodereferencen oprettes, kastes en NullPointerException på kaldetidspunktet, ikke på bindingstidspunktet:
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");
}Sammenfatning af sammenligningen
Tre former for metodereferencer sammenlignet:
- ClassName::staticMethod — statisk, uden modtager
- instance::instanceMethod — bundet til et bestemt objekt
- ClassName::instanceMethod — modtageren er elementet i strømmen (vilkårlig instans)
Hurtig kontrol
Givet EventHandler h = new EventHandler(); list.forEach(h::handle); — hvad er modtageren for kaldet på handle for hvert element?
Opsummering: Metodereferencer til specifikke instanser
Vigtige pointer:
- Syntaks: instance::methodName — indfanger et bestemt objekt
- Det indfangede objekt er modtageren ved hvert kald
- Ideelt til tilbagekald, lyttere og logningsmønstre
- Den indfangede instans' aktive tilstand er synlig via referencen
- NPE ved kald, hvis instansen er null (ikke ved binding)
Lær Java 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
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Referencer til instansmetoder på en bestemt instans” gratis?
Ja — hele teksten til “Referencer til instansmetoder på en bestemt instans” 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 Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Referencer til instansmetoder på en bestemt instans”?
Indfang et bestemt objekt, og referér til en af dets instansmetoder til callbacks og lyttere. Du øver dig i Java Academy 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å Java Academy?
Der kræves ingen tidligere erfaring. Java Academy 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 “Referencer til instansmetoder på en bestemt instans”?
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 Java Academy-lektion?
Ja. Alle Java Academy-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
- Referencer til statiske metoder
- Referencer til instansmetoder på en bestemt instans
- Referencer til instansmetoder uden bestemt instans
- Konstruktørreferencer