Yapıcı Başvuruları
Supplier ve Function gibi işlevsel arayüzler aracılığıyla örnekler oluşturmak için ClassName::new kullanın.
Yapıcı Başvuruları, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Kurucu Referansları Nedir?
Kurucu referansı, işlevsel bir arayüz üzerinden nesne oluşturmak için ClassName::new kullanır. İşlevsel arayüzün parametreleri, kurucunun parametreleriyle eşleşir.
import java.util.function.*;
class Person {
String name;
Person(String name) { this.name = name; }
public String toString() { return "Person(" + name + ")"; }
}
// Function<String, Person> — calls Person(String)
Function<String, Person> factory = Person::new;
Person p = factory.apply("Alice");
System.out.println(p); // Person(Alice)Sağlayıcı Olarak Bağımsız Değişkensiz Kurucu
Bağımsız değişken almayan bir kurucu, Supplier<T> ile eşleşir:
class Counter {
int count = 0;
void inc() { count++; }
}
Supplier<Counter> newCounter = Counter::new;
Counter c1 = newCounter.get();
Counter c2 = newCounter.get(); // independent instances
c1.inc();
System.out.println(c1.count); // 1
System.out.println(c2.count); // 0BiFunction Olarak İki Bağımsız Değişkenli Kurucu
İki parametreli kurucular BiFunction<T,U,R> ile eşleşir:
record Point(int x, int y) {}
BiFunction<Integer, Integer, Point> makePoint = Point::new;
Point p = makePoint.apply(3, 4);
System.out.println(p); // Point[x=3, y=4]Stream.map İçinde Kurucu Referansı
Bir kurucu referansı kullanarak dizeleri nesnelere dönüştürün:
import java.util.*;
import java.util.stream.*;
List<String> names = List.of("Alice","Bob","Carol");
List<Person> people = names.stream()
.map(Person::new) // calls new Person(name) for each
.collect(Collectors.toList());
people.forEach(System.out::println);
// Person(Alice)
// Person(Bob)
// Person(Carol)Dizi Kurucusu Referansı
Type[]::new ile dizileri dinamik olarak oluşturun. Bu yapı Stream.toArray() tarafından kullanılır:
import java.util.stream.*;
String[] arr = Stream.of("a","b","c")
.toArray(String[]::new);
for (String s : arr) System.out.print(s + " ");
// a b c
int[] sizes = {3, 5, 2};
String[][] matrix = Arrays.stream(sizes)
.mapToObj(String[]::new)
.toArray(String[][]::new);Factory Arayüzü Kalıbı
Fabrikalar için özel bir işlevsel arayüz tanımlayın, ardından kurucu referanslarını kullanın:
@FunctionalInterface
interface Factory<T> {
T create(String config);
}
class DBConnection {
String url;
DBConnection(String url) { this.url = url; }
public String toString() { return "DB(" + url + ")"; }
}
Factory<DBConnection> dbFactory = DBConnection::new;
DBConnection conn = dbFactory.create("jdbc:postgresql://localhost/mydb");
System.out.println(conn);Kurucu Referanslarıyla Bağımlılık Enjeksiyonu
Çerçeveler, tembel örnek oluşturma için genellikle işlevsel fabrikalar kullanır. Kurucu referansları bu kalıbı sadeleştirir:
import java.util.function.*;
class ServiceLocator {
private final Map<String, Supplier<?>> registry = new HashMap<>();
<T> void register(String name, Supplier<T> factory) {
registry.put(name, factory);
}
@SuppressWarnings("unchecked")
<T> T get(String name) { return (T) registry.get(name).get(); }
}
ServiceLocator loc = new ServiceLocator();
loc.register("counter", Counter::new);
Counter c = loc.get("counter");Lambda ile Kurucu Referansı Arasında Seçim
Lambda gövdesi yalnızca new Type(args) ifadesinden oluşuyorsa kurucu referansı kullanın:
// Lambda:
Function<String, Person> f1 = name -> new Person(name);
// Constructor reference (preferred):
Function<String, Person> f2 = Person::new;
// When you need extra logic, stick with lambda:
Function<String, Person> f3 = name -> new Person(name.trim().toLowerCase());Jenerik Türler ve Kurucu Referansları
Jenerik sınıflar da kullanılabilir — tür, işlevsel arayüz bağlamından çıkarılır:
import java.util.*;
import java.util.function.*;
// ArrayList::new matches Supplier<ArrayList<String>>
Supplier<List<String>> listFactory = ArrayList::new;
List<String> l1 = listFactory.get();
List<String> l2 = listFactory.get(); // independent lists
l1.add("hello");
System.out.println(l2.size()); // 0Kurucu Referanslarını Kullanan Akış Toplayıcıları
Özel sonuç kapsayıcıları oluşturmak için toplayıcılarda kurucu referanslarını kullanın:
import java.util.stream.*;
// Collect into a LinkedList using a constructor reference supplier
LinkedList<String> linked = Stream.of("a","b","c")
.collect(Collectors.toCollection(LinkedList::new));
System.out.println(linked.getFirst()); // aİlkel Türler ve Otomatik Kutulama
Sarmalayıcı türler için kurucu referansları otomatik kutulamayı yönetir:
// Integer::new is deprecated in Java 9+, but illustrates the concept
// Use Integer.valueOf or just autoboxing in modern Java
Function<String, Integer> intParser = Integer::parseInt; // static method ref
System.out.println(intParser.apply("42")); // 42Hızlı Kontrol
ArrayList::new gibi bağımsız değişken almayan bir kurucu referansı hangi işlevsel arayüzle eşleşir?
Özet: Kurucu Referansları
Temel çıkarımlar:
- Söz dizimi: ClassName::new — eşleşen kurucuya devreder
- Bağımsız değişkensiz → Supplier<T>; tek bağımsız değişkenli → Function<T,R>; iki bağımsız değişkenli → BiFunction
- Dizi kurucusu: Type[]::new — Stream.toArray() ile kullanılır
- Lambda gövdesi yalnızca 'new Type(args)' olduğunda lambda'dan daha temizdir
- Türlü koleksiyon sonuçları için Collectors.toCollection(LinkedList::new) kullanın
Sıkça Sorulan Sorular
“Yapıcı Başvuruları” dersi ücretsiz mi?
Evet — “Yapıcı Başvuruları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Yapıcı Başvuruları” dersinde ne öğreneceğim?
Supplier ve Function gibi işlevsel arayüzler aracılığıyla örnekler oluşturmak için ClassName::new kullanın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Yapıcı Başvuruları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Statik Yöntem Başvuruları
- Belirli Bir Örnekte Örnek Yöntem Başvuruları
- Herhangi Bir Örneğin Yöntem Başvuruları
- Yapıcı Başvuruları