CodeBlanks Logo Icon CodeBlanks

Birleştirme

Tüm uzman konularını birleştirerek çalışan bir uygulama yazarsın.

Proje: birleştirme

Son derste tüm katmanları birleştireceksin. Önce bir bytecode denetçi eklersin: ClassVisitor arabirimi ve InspectorVisitor sınıfı sınıf adını yazdırır. Sonra main içinde kayıt, denetim, reaktif yayın, süre ölçümü ve yerel köprüyü ardışık çalıştırırsın.

Böylece beş katman — açıklama, desen, reaktif, performans, bytecode ve yerel — tek bir akışta birlikte çalışır. Bu, uzman seviyenin sentezidir.

Uygulama ClassVisitor ve InspectorVisitor ekle

Üstteki yapıya interface ClassVisitor ekle; void visitClass(String name); metodu olsun. class InspectorVisitor implements ClassVisitor tanımla; visitClass(String name) metodu System.out.println("inspecting: " + name); yapsın. main içinde new InspectorVisitor().visitClass("HelloService"); çağır.

Başlangıç kodu

Main.java
@interface Service {}

@Service
class HelloService {
    String greet() { return "hello"; }
}

interface Subscriber {
    void onNext(String item);
}

class SimplePublisher {
    java.util.List<Subscriber> subs = new java.util.ArrayList<>();
    void subscribe(Subscriber s) { subs.add(s); }
    void publish(String item) {
        for (Subscriber s : subs) s.onNext(item);
    }
}

class TimedPublisher {
    SimplePublisher delegate;
    TimedPublisher(SimplePublisher delegate) {
        this.delegate = delegate;
    }
    void publish(String item) {
        long start = System.nanoTime();
        delegate.publish(item);
        long elapsed = System.nanoTime() - start;
        System.out.println("elapsed measured: " + (elapsed >= 0));
    }
}

class Registry {
    java.util.Map<String, Object> services = new java.util.HashMap<>();
    void put(String name, Object instance) { services.put(name, instance); }
    Object get(String name) { return services.get(name); }
}

class NativeBridge {
    static String describe(String cls, String method, String sig) {
        return "Java_" + cls + "_" + method + sig;
    }
}

public class Main {
    public static void main(String[] args) {
        Registry registry = new Registry();
        registry.put("hello", new HelloService());
        System.out.println(NativeBridge.describe("HelloService", "greet", "()Ljava/lang/String;"));
    }
}

Örnek çözüm

Main.java
@interface Service {}

@Service
class HelloService {
    String greet() { return "hello"; }
}

interface Subscriber {
    void onNext(String item);
}

class SimplePublisher {
    java.util.List<Subscriber> subs = new java.util.ArrayList<>();
    void subscribe(Subscriber s) { subs.add(s); }
    void publish(String item) {
        for (Subscriber s : subs) s.onNext(item);
    }
}

class TimedPublisher {
    SimplePublisher delegate;
    TimedPublisher(SimplePublisher delegate) {
        this.delegate = delegate;
    }
    void publish(String item) {
        long start = System.nanoTime();
        delegate.publish(item);
        long elapsed = System.nanoTime() - start;
        System.out.println("elapsed measured: " + (elapsed >= 0));
    }
}

class Registry {
    java.util.Map<String, Object> services = new java.util.HashMap<>();
    void put(String name, Object instance) { services.put(name, instance); }
    Object get(String name) { return services.get(name); }
}

class NativeBridge {
    static String describe(String cls, String method, String sig) {
        return "Java_" + cls + "_" + method + sig;
    }
}

interface ClassVisitor {
    void visitClass(String name);
}

class InspectorVisitor implements ClassVisitor {
    public void visitClass(String name) {
        System.out.println("inspecting: " + name);
    }
}

public class Main {
    public static void main(String[] args) {
        new InspectorVisitor().visitClass("HelloService");
    }
}

Beklenen çıktı

inspecting: HelloService

Uygulama tüm katmanları birleştiren main'i yaz

Üstteki yapıdaki main metodunu değiştir: Registry registry = new Registry(); oluştur, HelloService svc = new HelloService(); ile servisi yapıp registry.put("hello", svc); ile kaydet. new InspectorVisitor().visitClass("HelloService"); çağır. SimplePublisher publisher = new SimplePublisher(); oluştur, publisher.subscribe(s -> System.out.println("got: " + s)); ile abone ol, new TimedPublisher(publisher).publish(svc.greet()); çağır. Son olarak System.out.println(NativeBridge.describe("HelloService", "greet", "()Ljava/lang/String;")); yazdır.

Başlangıç kodu

Main.java
@interface Service {}

@Service
class HelloService {
    String greet() { return "hello"; }
}

interface Subscriber {
    void onNext(String item);
}

class SimplePublisher {
    java.util.List<Subscriber> subs = new java.util.ArrayList<>();
    void subscribe(Subscriber s) { subs.add(s); }
    void publish(String item) {
        for (Subscriber s : subs) s.onNext(item);
    }
}

class TimedPublisher {
    SimplePublisher delegate;
    TimedPublisher(SimplePublisher delegate) {
        this.delegate = delegate;
    }
    void publish(String item) {
        long start = System.nanoTime();
        delegate.publish(item);
        long elapsed = System.nanoTime() - start;
        System.out.println("elapsed measured: " + (elapsed >= 0));
    }
}

class Registry {
    java.util.Map<String, Object> services = new java.util.HashMap<>();
    void put(String name, Object instance) { services.put(name, instance); }
    Object get(String name) { return services.get(name); }
}

class NativeBridge {
    static String describe(String cls, String method, String sig) {
        return "Java_" + cls + "_" + method + sig;
    }
}

interface ClassVisitor {
    void visitClass(String name);
}

class InspectorVisitor implements ClassVisitor {
    public void visitClass(String name) {
        System.out.println("inspecting: " + name);
    }
}

public class Main {
    public static void main(String[] args) {
        new InspectorVisitor().visitClass("HelloService");
    }
}

Örnek çözüm

Main.java
@interface Service {}

@Service
class HelloService {
    String greet() { return "hello"; }
}

interface Subscriber {
    void onNext(String item);
}

class SimplePublisher {
    java.util.List<Subscriber> subs = new java.util.ArrayList<>();
    void subscribe(Subscriber s) { subs.add(s); }
    void publish(String item) {
        for (Subscriber s : subs) s.onNext(item);
    }
}

class TimedPublisher {
    SimplePublisher delegate;
    TimedPublisher(SimplePublisher delegate) {
        this.delegate = delegate;
    }
    void publish(String item) {
        long start = System.nanoTime();
        delegate.publish(item);
        long elapsed = System.nanoTime() - start;
        System.out.println("elapsed measured: " + (elapsed >= 0));
    }
}

class Registry {
    java.util.Map<String, Object> services = new java.util.HashMap<>();
    void put(String name, Object instance) { services.put(name, instance); }
    Object get(String name) { return services.get(name); }
}

class NativeBridge {
    static String describe(String cls, String method, String sig) {
        return "Java_" + cls + "_" + method + sig;
    }
}

interface ClassVisitor {
    void visitClass(String name);
}

class InspectorVisitor implements ClassVisitor {
    public void visitClass(String name) {
        System.out.println("inspecting: " + name);
    }
}

public class Main {
    public static void main(String[] args) {
        Registry registry = new Registry();
        HelloService svc = new HelloService();
        registry.put("hello", svc);
        new InspectorVisitor().visitClass("HelloService");
        SimplePublisher publisher = new SimplePublisher();
        publisher.subscribe(s -> System.out.println("got: " + s));
        new TimedPublisher(publisher).publish(svc.greet());
        System.out.println(NativeBridge.describe("HelloService", "greet", "()Ljava/lang/String;"));
    }
}

Beklenen çıktı

inspecting: HelloService
got: hello
elapsed measured: true
Java_HelloService_greet()Ljava/lang/String;

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Birleştirme adımı neyi gösterir?

  • Tek bir kavramı
  • Yalnızca veri tabanını
  • Tüm katmanların birlikte çalışmasını Doğru cevap
  • Yalnızca grafik arayüzü

Açıklama: Birleştirme beş katmanın tek akışta çalışmasını gösterir.

2 denetçi çağrısını tamamla

Soru
new InspectorVisitor().visitClass(____);
Cevap
new InspectorVisitor().visitClass("HelloService");

Açıklama: visitClass("HelloService") sınıf adını ziyaret eder.

3 birleştirme akışını eşleştir

Kavram Anlamı
Registry.put Hizmet kaydı
InspectorVisitor Sınıf denetimi
TimedPublisher Süre ölçümü
NativeBridge Yerel köprü

Uzman bölümündeki tüm dersler