603 Matching Annotations
  1. Jun 2025
    1. Object Class Feature

      Key takeaway penting * equals itu secara default/tanpa override punya behavior yang sama seperti ==, kalo di String otomatis di override jadi membandingkan isi value String * hashcode pada String akan selalu sama kalau valuenya sama * kalo bikin clone pake metode Prototype, dia value sama tapi reference memory akan baru, jadi beneran membuat objek baru instead of "nge-relay" ke objek lain

    2. hashCode

      dimodif jadi ga totally random tapi berdasarkan isi rectangle, kalo sama maka hashcode sama

      kalo ga di override akan selalu random untuk objek baru walau isinya sama

    3. 224162822416282241628
      • Pada String, hashCode() dihitung dari isi String.
      • Semua String dengan isi yang sama, hashCode-nya pasti sama, walau objeknya berbeda.
      • Karena itu, st1, st2, dan st3 punya hashCode yang sama.
    1. Eksekusijava -cp .;<full path to JUnit.jar> org.junit.runner.JUnitCoreSubscriptionTest

      java -cp ".:junit-4.13.2.jar:hamcrest-core-1.3.jar" org.junit.runner.JUnitCore TestingJUnit.CalculatorTest

    1. Documented
      • @Documented adalah annotation di Java yang digunakan agar annotation custom yang kamu buat ikut muncul di dokumentasi Javadoc.
      • Jika sebuah annotation diberi @Documented, maka saat kamu generate dokumentasi (misal dengan Javadoc), annotation tersebut akan terlihat di dokumentasi kelas, method, atau field yang menggunakannya.
      • Tanpa @Documented, annotation custom tidak akan muncul di hasil dokumentasi Javadoc, meskipun dipakai di kode.
      • Intinya: @Documented dipakai supaya annotation kamu terdokumentasi secara otomatis di Javadoc. /n \n Apa itu JavaDoc?
      • Javadoc adalah tool untuk membuat dokumentasi otomatis dari kode Java dalam bentuk HTML.
    2. â—¼Pemrosesan Runtime, beberapa annotationsdapat digunakan saat runtim
      • Maksudnya, beberapa annotation di Java bisa dibaca dan dimanfaatkan oleh program saat program sedang berjalan (runtime), bukan hanya saat compile.
      • Annotation seperti ini biasanya diberi @Retention(RetentionPolicy.RUNTIME).
      • Contohnya: framework seperti Spring atau Hibernate menggunakan annotation untuk konfigurasi, dan annotation itu dibaca lewat Reflection saat aplikasi berjalan.
      • Jadi, annotation tidak hanya untuk informasi ke compiler, tapi juga bisa mengatur perilaku program secara dinamis saat runtime.
    1. J2EE Patterns

      J2EE Patterns (Java 2 Platform, Enterprise Edition):

      * Fokus pada pengembangan aplikasi enterprise dengan Java
      * Spesifik untuk lapisan presentasi (presentation tier)
      * Contoh: MVC (Model-View-Controller),
      
    1. Join

      Dia itu mirip dengan sync

      • Synchronized dan join() sama-sama membuat eksekusi thread jadi berurutan/serial di bagian tertentu, tapi cara kerjanya berbeda.
      • Synchronized:
      • Berlaku untuk semua thread yang ingin mengakses blok kode/data yang sama.
      • Semua thread harus antri masuk ke blok synchronized, hanya satu yang bisa eksekusi dalam satu waktu.
      • join():
      • Hanya berlaku untuk thread yang memanggil join().
      • Thread yang memanggil join akan menunggu thread tertentu selesai sebelum lanjut.
      • Kesimpulan:
      • Synchronized = serialisasi akses ke resource untuk semua thread.
      • join() = serialisasi urutan eksekusi, hanya untuk thread yang memanggil join pada thread lain.
    1. Melewatkan task aplikasi ke eksekutor

      ada eksekutor sehingga programmer tidak perlu memikirkan threading.

      • Tidak perlu dirawat manual seperti join atau sleep.
      • Jika pakai ExecutorService, manajemen thread (mulai, berhenti, antrian) sudah diatur otomatis oleh executor.
      • join() biasanya dipakai kalau kamu buat thread manual dan ingin menunggu thread selesai.
      • Pada ExecutorService, kamu cukup:
      • submit task ke executor,
      • shutdown() executor jika semua task sudah dikirim,
      • Jika perlu menunggu semua task selesai, bisa pakai awaitTermination() setelah shutdown().
      • sleep() tetap bisa dipakai di dalam task jika memang perlu jeda, tapi bukan untuk mengatur thread pool-nya.
      • Kesimpulan:
      • ExecutorService membuat pengelolaan thread jadi lebih mudah dan otomatis,
      • Tidak perlu join/sleep untuk mengatur thread pool-nya.
    2. Mengendalikan langsung penciptaan danmanajemen thread
      • Mengendalikan langsung penciptaan dan manajemen thread:
      • Programmer membuat dan mengatur thread sendiri secara manual.
      • Biasanya dengan membuat objek dari class Thread atau mengimplementasikan interface Runnable.
      • Programmer harus mengatur sendiri kapan thread dimulai, dihentikan, dan bagaimana sinkronisasinya.
      • Contoh:<br /> java Thread t = new Thread(new MyRunnable()); t.start();
      • Kelebihan: kontrol penuh atas thread.
      • Kekurangan: lebih rumit, rawan error jika tidak hati-hati.

      • Melewatkan task aplikasi ke eksekutor:

      • Programmer tidak perlu mengatur thread secara langsung.
      • Menggunakan Executor Service (fitur di Java) untuk menyerahkan tugas (task) ke thread pool.
      • Executor akan mengelola thread secara otomatis (membuat, menjalankan, menghentikan).
      • Contoh:<br /> java ExecutorService executor = Executors.newFixedThreadPool(2); executor.submit(new MyRunnable());
      • Kelebihan: lebih mudah, thread dikelola otomatis, cocok untuk aplikasi besar.
      • Kekurangan: kontrol thread tidak sedetail cara manual.

    Annotators

    1. synchronized
      • karena sync, berarti akan dipastikan hanya ada satu thread yang mengeksekusi suatu method/akses suatu data, yang lain akan nunggu
      • dia itu berati kaya "serial" di dbms
    1. Interface

      Harus di implement? -> Di implementasikan oleh implements seperti ArrayList, HashSet - Iya, interface Collection ini harus diimplementasikan oleh class lain supaya bisa digunakan<br /> - Interface hanya berisi deklarasi method (tanpa isi), jadi class yang mengimplementasikan harus menyediakan isi/logic dari method-method tersebut<br /> - Contoh class yang mengimplementasikan Collection: ArrayList, HashSet, LinkedList<br /> - Dengan implementasi ini, class-class tersebut bisa punya fitur dasar koleksi seperti tambah, hapus, cek isi, dll<br /> - Tujuannya supaya semua koleksi punya perilaku standar dan bisa digunakan dengan cara yang sama

    Annotators

  2. May 2025
    1. throw new SampleException(e)

      ini diteruskan, berarti pemanggil fungsi baru ini harus nge catch lagi.

      • Benar!
      • throw new SampleException(e); artinya exception baru dilempar lagi ke atas stack.
      • Exception ini bisa ditangkap (catch) oleh handler lain di pemanggilnya (di luar blok try-catch ini).

      Contoh kode:

      ```java public class Main { public static void main(String[] args) { try { bacaFile(); } catch (SampleException se) { System.out.println("SampleException ditangkap di main: " + se.getMessage()); } }

      static void bacaFile() throws SampleException {
          try {
              // Simulasi error
              throw new java.io.FileNotFoundException("File tidak ditemukan!");
          } catch (java.io.FileNotFoundException e) {
              System.err.println("FileNotFoundException: " + e.getMessage());
              throw new SampleException(e); // dilempar ke atas (main)
          } catch (java.io.IOException e) {
              System.err.println("Caught IOException: " + e.getMessage());
          }
      }
      

      }

      // Contoh custom exception class SampleException extends Exception { public SampleException(Throwable cause) { super(cause); } } ```


      • Penjelasan:
      • Di bacaFile(), jika terjadi FileNotFoundException, akan dilempar lagi sebagai SampleException.
      • Di main, ada handler untuk SampleException, sehingga error bisa ditangkap dan ditangani di sana.
      • Intinya:
      • throw new SampleException(e); = melempar error ke atas, supaya bisa di-handle di tempat lain (pemanggilnya).

    Annotators

    1. Setelah method melempar exception, runtimesystem akan mencari sesuatu untuk meng-handle itu (disebutexception handler)

      Pada kode biasa (tanpa exception), penanganan error dilakukan manual oleh pemanggil fungsi, biasanya dengan if-else atau pengecekan kondisi. - Contoh: fungsi return nilai khusus (misal null, -1, atau kode error lain) jika terjadi error. - Pemanggil fungsi harus mengecek hasil return dan memutuskan sendiri cara menangani error. - Contoh kode: int hasil = hitung(); if (hasil == -1) { // handle error di sini }

      Pada mekanisme exception, jika terjadi error (exception dilempar), yang menangani adalah exception handler (blok catch), bukan pemanggil fungsi secara langsung. - Error otomatis dilempar ke exception handler terdekat, tanpa harus return nilai khusus dan dicek manual. - Intinya: - Tanpa exception: error dicek dan di-handle manual oleh pemanggil fungsi. - Dengan exception: error otomatis dilempar ke exception handler (catch) yang akan menangkap dan menangani error tersebut.

    1. KelasClass
      • Kelas Class di Java digunakan untuk mengakses informasi tentang sebuah kelas (misal: nama, method, field, dsb) secara runtime.
      • Nama lengkapnya adalah java.lang.Class.
      • Tidak perlu import karena sudah otomatis tersedia dari package java.lang.
      • Tidak bisa dibuat dengan new, harus dengan cara khusus (misal: NamaKelas.class atau objek.getClass()).
      • Biasanya dipakai untuk reflection (misal: membuat objek secara dinamis, melihat struktur kelas saat program berjalan).
      • Contoh penggunaan:
      • Mengetahui nama kelas dari sebuah objek: objek.getClass().getName()
      • Mendapatkan semua method dari sebuah kelas: objek.getClass().getMethods()
    1. Singleton

      Termasuk creational karna mengatur kapan dan bagaimana objek diciptakan - Singleton Pattern adalah salah satu creational pattern. - Memastikan hanya ada satu objek dari suatu class yang dibuat selama aplikasi berjalan. - Cocok untuk kasus seperti konfigurasi global, koneksi database, atau logger.

      • Cara kerja:
      • Hanya satu class yang bertanggung jawab membuat objek, dan objeknya hanya satu.
      • Objek bisa diakses dari mana saja tanpa perlu membuat instance baru.

      • Implementasi:

      • Constructor class dibuat private agar tidak bisa diinstansiasi dari luar.
      • Class punya static instance dari dirinya sendiri.
      • Class menyediakan static method (misal: getInstance()) untuk mengakses objek tersebut.

      • Manfaat:

      • Menghemat resource karena objek hanya dibuat sekali.
      • Menghindari konflik data karena semua akses ke objek lewat instance yang sama.

      • Contoh kode sederhana (Java): ```java public class Singleton { private static Singleton instance; private Singleton() {} // private constructor

        public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } `` - Dengan cara ini, setiap pemanggilanSingleton.getInstance()` akan selalu mengembalikan objek yang sama.

    2. Types of Design Patterns
      • Creational Patterns
      • Mengatur cara membuat objek tanpa memperlihatkan detail proses pembuatannya.
      • Contoh: Singleton, Factory, Builder.

      • Structural Patterns

      • Mengatur cara menyusun class dan objek agar bisa bekerja sama dengan baik.
      • Contoh: Adapter, Composite, Decorator.

      • Behavioral Patterns

      • Fokus pada cara objek saling berkomunikasi dan bertukar pesan.
      • Contoh: Observer, Strategy, Command.

      • J2EE Patterns

      • Khusus untuk aplikasi enterprise (Java EE), biasanya terkait tampilan/presentasi.
      • Contoh: MVC (Model-View-Controller), Front Controller.
    1. Dependency Inversion Principle
      • Messenger ini interface
      • Coupling menjadi lebih loose (Coupling adalah tingkat ketergantungan antar modul, semakin rendah semakin baik.)
    2. Abstractions should not depend upon details.Details should depend upon the abstractions

      Kode implementasi menyesuaikan dengan interface (abstraksi), bukan sebaliknya.

    3. High level components should not depend uponlow level components. Instead, both should dependon abstractions
      • Komponen tingkat tinggi (misal: logika bisnis) tidak boleh langsung bergantung pada komponen tingkat rendah (misal: database, file, API).
      • Keduanya harus bergantung pada abstraksi (interface atau abstract class).
    4. Interface Segregation Principle
      • Inti prinsip Interface Segregation:
      • Client (pengguna interface) tidak boleh dipaksa bergantung pada method yang tidak mereka butuhkan.

      • Masalah umum:

      • Sering kali dibuat satu interface besar untuk memenuhi semua kebutuhan client.
      • Akibatnya, class yang mengimplementasi interface harus membuat method yang tidak dipakai.

      • Solusi:

      • Bagi interface besar menjadi beberapa interface kecil sesuai kebutuhan masing-masing client.
      • Setiap class hanya mengimplementasi interface yang benar-benar dibutuhkan.

      • Contoh:

      • Jangan buat interface IMultifungsi dengan method print, scan, fax, copy sekaligus.
      • Lebih baik buat interface terpisah: IPrinter, IScanner, IFax, ICopier.
    5. Substitution Failures
      • Masalah saat Square (Persegi) diturunkan dari Rectangle (Persegi Panjang):
      • Persegi panjang punya dua properti: lebar dan tinggi yang bisa berbeda.
      • Persegi harus punya lebar dan tinggi yang selalu sama.
      • Jika persegi adalah subclass dari persegi panjang, salah satu properti (lebar/tinggi) jadi tidak berguna (redundant).

      • Perilaku Persegi dan Persegi Panjang Berbeda:

      • Pada persegi panjang, mengubah lebar tidak mempengaruhi tinggi, dan sebaliknya.
      • Pada persegi, mengubah lebar otomatis mengubah tinggi (harus sama).
      • Jadi, objek persegi tidak bisa sepenuhnya menggantikan objek persegi panjang tanpa mengubah perilaku yang diharapkan.

      • Kesimpulan:

      • Ini contoh pelanggaran Liskov Substitution Principle.
      • Persegi bukan persegi panjang secara perilaku, sehingga tidak cocok dijadikan subclass.
    6. Liskov’s Substitution Principle
      • Masalah pada kode:
      • CasualEmployee memanggil method dari superclass (super.getProjectDetails(empId)), sehingga tetap mengikuti perilaku class induk.
      • ContractEmployee tidak memanggil method dari superclass, sehingga perilaku superclass diabaikan (broken the base class).
      • Jika kode lain mengharapkan perilaku dari class Employee, maka ContractEmployee bisa menyebabkan error atau hasil yang tidak sesuai.

      • Pelanggaran Liskov Substitution Principle:

      • Subclass (ContractEmployee) tidak sepenuhnya bisa menggantikan superclass (Employee) tanpa mengubah perilaku yang diharapkan.
      • Kode yang menggunakan Employee bisa gagal jika menerima ContractEmployee.

      • Solusi:

      • Pastikan semua subclass tetap menjaga kontrak/perilaku dari superclass.
      • Jika override method, tetap panggil method superclass jika memang dibutuhkan, atau pastikan perilaku tetap konsisten.

      • Manfaat solusi:

      • Kode lebih aman, fleksibel, dan mudah dikembangkan.
      • Tidak ada perilaku aneh saat subclass digunakan menggantikan superclass.

    Annotators

    1. 16
      • Dibuat interface shape
      • Masalah kapan pake abstract atau interface. Abstract bisa aja ada implementasi, interface fully kosong. Belum lagi tentang multiple inheritance
    2. Open/Closed Principle
      • Gunakan abstract class Payment dengan method pay() yang abstrak.
      • Setiap metode pembayaran (Cash, CreditCard) dibuat sebagai class turunan yang mengimplementasikan pay().
      • Jika ingin menambah metode pembayaran baru, cukup buat class baru tanpa mengubah kode lama.
      • Sesuai prinsip Open/Closed: kode lama tetap, fitur baru tinggal tambah class.
    3. Open/Closed Principle

      Masalah: * Setiap kali ada metode pembayaran baru, harus ubah method pay() di class PaymentManager. * Melanggar prinsip Open/Closed karena kode lama harus diubah untuk menambah fitur baru. * Kode jadi sulit dipelihara dan rawan error jika ada perubahan.

    4. Responsibility

      Masalah dari sini * Harusnya calculate pay itu berhubungan sama payment * Employee isinya HANYA yang berkaitan dengan employee * Save ada method khusus yang lebih low level

    5. ave one and only one reason tochange
      • Setiap class/module hanya punya satu alasan untuk berubah.
      • Contoh: Class "User" hanya untuk data user, bukan untuk kirim email.
    6. Immobility
      • Sulit digunakan ulang di aplikasi lain karena terlalu terikat dengan aplikasi saat ini.
      • Contoh: Mau pakai modul di project lain, tapi harus bongkar banyak kode agar bisa dipakai.

    Annotators

    1. Masking

      intinya kalo ada suara yang nembus (yg merah panah) dia akan mempengaruhi panahnya yang potensial membuat suara lain akan jadi tertutup (contohnya pada kasus maskee)

    1. Liveness

      Deadlock:

      Contoh: Thread A pegang resource 1, butuh resource 2; Thread B pegang resource 2, butuh resource 1. Keduanya saling tunggu, tidak ada yang jalan.

      Starvation:

      Contoh: Ada banyak thread, tapi satu thread selalu kalah cepat, jadi tidak pernah dapat akses ke resource yang dibutuhkan.

      Livelock:

      Contoh: Dua thread terus saling mengalah, misal: Thread A dan B terus-menerus melepaskan resource agar yang lain bisa jalan, tapi akhirnya tidak ada yang benar-benar jalan.

    2. Livelock: situasi dimana dua atau lebih threadtidak mengalami kemajuan namun tidak terblok

      dua atau lebih thread terus berubah-ubah status (aktif), tapi tidak ada yang benar-benar maju atau selesai, walau tidak terblokir

    3. sebuah threadtidak bisa mendapatkan akses ke resourcebersama (shared) dan tidak ada kemajuan

      misal ada orang disuruh ngambil kursi, tapi gamau berdiri buat ambil kursinya

    4. Memory Consistency Errorsâ—¼ int counter = 0â—¼ Thread A: counter++â—¼ Thread B: System.out.println(counter)
      • Pada contoh:

      • counter awalnya 0

      • Thread A melakukan counter++ (harusnya counter jadi 1)
      • Tapi, Thread B bisa saja membaca nilai counter sebelum perubahan dari Thread A tersimpan di memori utama
      • Akibatnya, Thread B bisa saja tetap membaca nilai 0, bukan 1
    5. Thread A: Simpan ke câ—¼ Thread B: Simpan ke c
      • Hasil akhir salah karena perubahan Thread A tertimpa thread B
      • Seharusnya, jika satu tambah dan satu kurang, hasil tetap 0, tapi bisa jadi -1 atau 1
    6. Synchronization
      • Thread sering berbagi akses ke variabel (field) atau objek yang sama
      • Cara ini membuat thread bisa saling bertukar data atau bekerja sama
      • Tapi, jika tidak diatur, bisa muncul masalah seperti:
      • Thread interference:
        • Dua atau lebih thread mengakses dan mengubah data yang sama secara bersamaan
        • Hasil akhirnya bisa jadi tidak sesuai harapan (data jadi kacau)
      • Memory consistency errors:

        • Perubahan data oleh satu thread tidak langsung terlihat oleh thread lain
        • Thread lain bisa membaca data lama, bukan data terbaru
      • Contoh masalah:

      • Dua thread menambah nilai pada variabel yang sama, hasil akhirnya bisa salah karena prosesnya tumpang tindih

      • Solusi:

      • Pakai synchronization untuk mengatur agar hanya satu thread yang bisa mengakses data tertentu pada satu waktu
      • Dengan synchronization, data tetap aman dan konsisten meski diakses banyak thread
    1. InterruptedException

      Flashback, exception ada 2 macam - Checked Exception:<br /> - Harus ditangani (try-catch) atau dideklarasikan (throws) di method<br /> - Dicek oleh compiler saat compile<br /> - Contoh: IOException, SQLException<br /> - Biasanya untuk error yang bisa diprediksi dan diatasi (misal: file tidak ditemukan)

      • Unchecked Exception:
      • Tidak wajib ditangani atau dideklarasikan
      • Tidak dicek oleh compiler saat compile
      • Contoh: NullPointerException, ArrayIndexOutOfBoundsException
      • Biasanya untuk error karena bug di kode (misal: akses data null, index salah)

      • Intinya:

      • Checked: harus ditangani, dicek compiler
      • Unchecked: tidak wajib ditangani, tidak dicek compiler
    2. Interrupts

      Interrupt digunakan untuk memberitahu thread agar berhenti atau membatalkan tugasnya - Interrupt digunakan untuk memberitahu thread agar berhenti atau membatalkan tugasnya<br /> - Ada dua cara utama menangani interrupt di thread: - Menangkap (catch) InterruptedException<br /> - Biasanya terjadi saat thread sedang sleep atau wait<br /> - Jika terjadi, thread bisa langsung berhenti atau melakukan cleanup - Cek status interrupt dengan Thread.interrupted()<br /> - Method ini mengembalikan true jika thread sudah di-interrupt<br /> - Cocok untuk loop atau proses panjang<br /> - Jika return true, thread bisa keluar dari loop atau berhenti kerja

      • Contoh di gambar:
      • Setiap kali selesai proses heavyCrunch, thread cek apakah sudah di-interrupt
      • Jika iya, thread langsung keluar dari loop dengan return
      • Ini membuat thread bisa berhenti dengan aman saat diminta

      • Manfaat:

      • Thread tidak langsung dipaksa berhenti, tapi diberi kesempatan untuk menyelesaikan tugas penting atau membersihkan resource
      • Lebih aman dan terkontrol daripada memaksa thread berhenti
    3. throws
      • Kalau throws diletakkan di main (seperti public static void main(String[] args) throws InterruptedException):
      • Artinya, jika ada error (exception) terjadi di dalam main, error itu akan diteruskan ke sistem Java (JVM)
      • Program bisa langsung berhenti jika exception terjadi
      • Tidak perlu menangkap (catch) exception di dalam main

      • Kalau throws diletakkan di method lain (bukan di main):

      • Method itu memberitahu pemanggilnya bahwa bisa terjadi exception
      • Pemanggil method harus menangani (catch) exception, atau ikut meneruskan dengan throws juga
      • Exception bisa "diteruskan" ke atas sampai akhirnya sampai ke main atau ke JVM

      • Intinya:

      • throws di main: error diteruskan ke sistem, program bisa berhenti
      • throws di method lain: error harus ditangani oleh pemanggil method tersebut
    4. //Pause for 4 secondsThread.sleep(4000);
      • Akan "tidur" dulu 4 detik
      • Sebenernya gaakan eksak 4 detik karena kalau misalkan kondisi antrian di processor panjang bisa muncul delay tambahan, let's say jadi 4.123 detik
      • Thread yang akan berhenti adalah thread yang menjalankan perintah sleep (jadi thread itu walau bisa banyak tapi gabisa dijalanin berbarengan, jadi currentThread yang manggil lah yang di sleep)
    1. Thread
      • Cara ini lebih simple karena langsung extend class Thread
      • Cukup override method run() dan panggil start()
      • Kekurangan:
      • Java tidak mendukung multiple inheritance, jadi kalau sudah extend Thread, tidak bisa extend class lain
      • Kalau butuh multiple inheritance (misal class harus extend class lain juga), lebih baik pakai implement Runnable
      • Dengan implement Runnable, class tetap bisa extend class lain dan tetap bisa dijalankan sebagai thread
      • Pilih cara ini (extends Thread) hanya jika tidak perlu extend class lain
    2. Concurrency
      • Dahulu komputer cuman bisa run satu aktivitas dalam satu waktu
      • Konsep konkuren disini mirip di MBD
      • Concurrent = multiple process dijalankan secara bersamaan pada prosessor
      • Process adalah program yang sedang berjalan di komputer
      • Proses dijalankan dalam memori masing2
      • Satu proses bisa memiliki banyak thread
      • Thread merupakan unit eksekusi yang lebih kecil dalam proses
      • Thread pasti lebih ringan dan cepat dibanding proses
      • Perbedaan:
      • Process: terpisah dan tidak sharing memory
      • Thread: saling berbagi memori dalam satu proses

    Annotators

  3. Apr 2025

    Annotators

    1. static void filter(Collection<?> c) {for (Iterator<?> it = c.iterator(); it.hasNext(); )if (!cond(it.next()))it.remove();}
      • Fungsi filter(Collection<?> c) digunakan untuk menyaring dan menghapus elemen dari koleksi sesuai kondisi tertentu.
      • Langkah-langkah kode:
      • Buat iterator:<br /> Iterator<?> it = c.iterator();<br /> Membuat objek iterator untuk menelusuri koleksi c.
      • Loop selama ada elemen:<br /> for (; it.hasNext(); )<br /> Selama masih ada elemen berikutnya di koleksi, lakukan proses di dalam loop.
      • Ambil elemen berikutnya:<br /> it.next()<br /> Mengambil elemen berikutnya dari koleksi.
      • Cek kondisi:<br /> if (!cond(it.next()))<br /> Jika elemen tidak memenuhi kondisi (fungsi cond mengembalikan false), maka:
      • Hapus elemen:<br /> it.remove();<br /> Elemen yang tidak memenuhi syarat akan dihapus dari koleksi.
      • Intinya:
      • Kode ini menelusuri koleksi satu per satu, cek kondisi, dan hapus elemen yang tidak sesuai.
      • Iterator dipakai supaya bisa hapus elemen saat iterasi tanpa error.
    2. boolean add(E element);boolean remove(Object element);
      • add(E element):
      • Hanya bisa menambah data yang jenisnya sama dengan koleksi.
      • Misal koleksi kamu Collection<Integer>, maka hanya bisa add(5) (harus Integer).

      • remove(Object element):

      • Bisa mencoba menghapus data apapun, tidak peduli jenisnya.
      • Tapi, yang akan dihapus hanya yang nilainya sama dengan yang ada di koleksi.
      • Misal koleksi kamu Collection<Integer>, kamu bisa remove("teks"), tapi tidak akan ada yang terhapus karena tidak ada "teks" di koleksi Integer.

      • Intinya:

      • add(E) khusus untuk tipe data yang sama dengan koleksi.
      • remove(Object) bebas tipe data apa saja, tapi hanya akan menghapus kalau ada yang cocok nilainya di koleksi.

    Annotators

    1. VENUS (4.869e+24, 6.0518e6),EARTH (5.976e+24, 6.37814e6),MARS (6.421e+23, 3.3972e6),JUPITER (1.9e+27, 7.1492e7),SATURN (5.688e+26, 6.0268e7),URANUS (8.686e+25, 2.5559e7),NEPTUNE (1.024e+26, 2.4746e7)

      manggial tiap konstruktor Planet (dibawah)

    2. rivate final double mass; // in kilogramsprivate final double radius; // in metersPlanet(double mass, double radius) {this.mass = mass;this.radius = radius;}private double mass() { return mass; }private double radius() { return radius;

      contoh bahwa enum bisa punya method atau atribut tambahan

    3. case
      • Switch di Java bisa juga pakai tipe data enum untuk pilihan yang lebih aman dan jelas.
      • Enum cocok untuk data yang nilainya terbatas dan sudah pasti, misal hari, status, level, dsb.
      • Penulisan switch dengan enum lebih rapi dan mencegah salah input.

      ```java enum Hari { SENIN, SELASA, RABU, KAMIS, JUMAT, SABTU, MINGGU }

      public class ContohSwitchEnum { public static void main(String[] args) { Hari hari = Hari.RABU; switch (hari) { case SENIN: System.out.println("Hari kerja awal"); break; case RABU: System.out.println("Hari tengah minggu"); break; case JUMAT: System.out.println("Hari menjelang akhir pekan"); break; default: System.out.println("Hari libur atau tidak dikenal"); } } } `` - Output:Hari tengah minggu`<br /> - Dengan enum, nilai yang dipakai di switch pasti valid dan tidak bisa typo.

    Annotators

    1. mirip dengan static initializer block tapitanpa keyword static

      perbedaannya: - Initializer block (tanpa static): - Dipakai untuk instance variabel (milik objek). - Kode di dalamnya dijalankan setiap kali objek baru dibuat. - Tidak pakai keyword static. - Contoh: java { // kode inisialisasi instance }

      • Static initialization block:
      • Dipakai untuk static variabel (milik kelas, bukan objek).
      • Kode di dalamnya dijalankan sekali saja saat kelas pertama kali di-load.
      • Pakai keyword static.
      • Contoh: java static { // kode inisialisasi static }

      • Perbedaan utama:

      • Waktu eksekusi:
        • Initializer block: setiap kali objek dibuat
        • Static block: hanya sekali saat kelas di-load
      • Kepemilikan variabel:
        • Initializer block: instance variabel
        • Static block: static variabel
      • Keyword:
        • Initializer block: tanpa static
        • Static block: pakai static
    2. Initializer Block
      • Initializer Block adalah blok kode di dalam kelas Java yang digunakan untuk menginisialisasi instance variabel.
      • Mirip dengan static initializer block, tapi tidak pakai keyword static.
      • Kode di dalam initializer block akan dijalankan setiap kali objek dibuat, sebelum konstruktor dijalankan.
      • Java compiler secara otomatis menyalin kode di initializer block ke setiap konstruktor di kelas tersebut.
      • Fungsinya untuk mengatur nilai awal variabel jika ada beberapa konstruktor, supaya tidak perlu menulis kode inisialisasi berulang-ulang di setiap konstruktor.
      • Contoh:

      java class Contoh { int x; { x = 10; // initializer block } Contoh() { // kode di initializer block otomatis dijalankan di sini } Contoh(int y) { // kode di initializer block juga dijalankan di sini x = y; } } - Jadi, setiap kali objek Contoh dibuat, kode di dalam { ... } (initializer block) akan dijalankan dulu.

    Annotators

    1. 9Kelebihan Exception

      Kelebihan yang ga disebutin: bisa buat checked exception dan unchecked exception.

      check exception akan membuat program jadi lebih safe sehingga tiap method akan punya throw swhingga selalu ada handline error yg dicegah saat COMPILE void pop( ) throws Exception

      kalo unchecked gaada dan akan terjadi saat runtime void pop( )

    2. rowable Class & Subclas
      • Error:
      • Menandakan masalah serius pada sistem (misal: kehabisan memori, stack overflow).
      • Biasanya tidak perlu dan tidak bisa ditangani oleh program.
      • Contoh: OutOfMemoryError, StackOverflowError.
      • Turunan dari class Error.

      • Exception:

      • Menandakan masalah yang masih bisa ditangani oleh program (misal: file tidak ditemukan, input salah).
      • Bisa ditangani dengan try-catch.
      • Contoh: IOException, NullPointerException, ArithmeticException.
      • Turunan dari class Exception.

      • Kesimpulan:

      • Error = masalah sistem, tidak untuk ditangani program.
      • Exception = masalah aplikasi, bisa dan sebaiknya ditangani program.

    Annotators

    1. 7Finally Block

      Bedanya finally sama ngecall fungsi setelah try-catch kelar:

      • finally:
      • Kode di dalam finally selalu dijalankan setelah try-catch, apapun hasilnya (ada error/tidak).
      • Cocok untuk hal yang harus dilakukan, misal: nutup file, bersihin resource.
      • Tidak perlu dipanggil manual, Java otomatis menjalankan finally.

      • Ngecall fungsi setelah try-catch:

      • Fungsi hanya dijalankan kalau program masih lanjut (tidak ada error fatal).
      • Kalau error tidak tertangani, kode setelah try-catch tidak dijalankan.
      • Harus dipanggil manual setelah blok try-catch.

      • Kesimpulan:

      • finally lebih aman untuk kode yang harus selalu dijalankan.
      • Ngecall fungsi setelah try-catch tidak selalu dijalankan, tergantung error.

      • Contoh kode: java public class ContohFinally { public static void main(String[] args) { try { System.out.println("Mulai try"); int hasil = 10 / 0; // Ini akan error (ArithmeticException) System.out.println("Setelah pembagian"); // Tidak dijalankan } catch (ArithmeticException e) { System.out.println("Terjadi error: " + e.getMessage()); } finally { System.out.println("Ini selalu dijalankan (finally)"); } System.out.println("Kode setelah try-catch-finally"); } }

      • Output:

        • "Mulai try"
        • "Terjadi error: / by zero"
        • "Ini selalu dijalankan (finally)"
        • "Kode setelah try-catch-finally"
      • Penjelasan:

        • Kode di finally tetap dijalankan walau ada error.
        • Kode setelah try-catch-finally juga dijalankan karena error sudah tertangani.
        • Kalau error tidak tertangani, kode setelah try-catch-finally tidak dijalankan, tapi finally tetap jalan.
    2. IOException
      • FileNotFoundException dan IOException adalah bawaan Java (built-in).
      • Keduanya ada di package java.io.
      • FileNotFoundException adalah turunan dari IOException.
      • Digunakan untuk menangani error saat operasi file/input-output.
      • Tidak perlu membuat sendiri, cukup import dari Java.
      • Contoh import: java import java.io.FileNotFoundException; import java.io.IOException;
      • Kesimpulan:
      • Keduanya bawaan Java, bukan bikinan sendiri.
    3. FileNotFoundException
      • FileNotFoundException dan IOException adalah bawaan Java (built-in).
      • Keduanya ada di package java.io.
      • FileNotFoundException adalah turunan dari IOException.
      • Digunakan untuk menangani error saat operasi file/input-output.
      • Tidak perlu membuat sendiri, cukup import dari Java.
      • Contoh import: java import java.io.FileNotFoundException; import java.io.IOException;
      • Kesimpulan:
      • Keduanya bawaan Java, bukan bikinan sendiri.
    4. catch and finally statements
      • try diisi kode utama yang diasumsikan berjalan normal/tanpa error.
      • Jika terjadi error/exception di dalam try, eksekusi langsung lompat ke catch.
      • catch menangani error yang terjadi di try.
      • finally (jika ada) selalu dijalankan, baik ada error atau tidak (biasanya untuk cleanup).
      • Dengan try-catch, kode utama jadi lebih bersih dan fokus pada alur normal, error ditangani terpisah.
      • Lebih rapi dibanding if-else yang harus cek error di setiap langkah.
      • try-catch cocok untuk kasus error yang tidak sering terjadi, atau error yang sulit diprediksi.
      • if-else lebih cocok untuk validasi sederhana yang bisa dicek sebelum proses utama.
      • Kesimpulan:
      • try-catch membuat kode lebih terstruktur dan mudah dibaca saat menangani error.
      • Error handling terpisah dari logika utama, tidak tercampur seperti di if-else.

    Annotators

    1. Exceptions Handler
      • return:
      • Setelah dieksekusi, langsung keluar dari method saat itu juga.
      • Nilai hasil return dikirim ke pemanggil (turun satu level di stack).
      • Proses berhenti di pemanggil, tidak lanjut ke atas lagi.
      • exception handler (throw):
      • Setelah throw, program mencari handler ke atas (naik di stack).
      • Jika tidak ada handler di method pemanggil, naik terus ke atas sampai ketemu handler atau sampai ke main.
      • Jika tidak ada handler sama sekali, program berhenti/error.
      • Kesimpulan:
      • return: keluar method, stack turun satu level, proses berhenti.
      • throw/exception: stack naik terus sampai ketemu handler atau sampai ke main.
    2. hrowing an exception
      • return digunakan untuk mengembalikan nilai dari sebuah fungsi/method ke pemanggilnya.
      • Setelah return dieksekusi, fungsi langsung berhenti dan keluar.
      • throw digunakan untuk melempar (menghasilkan) error/exception.
      • Setelah throw dieksekusi, program langsung lompat ke blok penanganan error (catch/except), bukan ke pemanggil fungsi.
      • return = mengirim hasil, throw = mengirim error.
      • Contoh:
      • return 5; → fungsi selesai, hasilnya 5.
      • throw new Error("Terjadi error"); → fungsi berhenti karena error, program cari penanganan error.
      • return dipakai di fungsi normal, throw dipakai saat ada masalah/error.

    Annotators

    1. Packages
      • Package adalah cara mengelompokkan kode Java seperti class, interface, dan objek ke dalam satu wadah atau folder.
      • Tujuannya adalah untuk mengorganisasi kode agar lebih rapi dan mudah dikelola yang bisa diatur pula visibilitasnya dengan access modifier.
      • Proteksi akses: Package membantu mengatur visibilitas (aksesibilitas) antar kelas, misalnya dengan modifier seperti public, protected, atau default (package-private).

    Annotators

    1. int i = 500;float gpa = 3.65f;byte mask = 0xff;

      karna ketiganya primitif, java menyediakan class untuk ketiganya yaitu Number

      tambahan, float perlu akhiran f karena kalo ngga bakal dianggap double (dan akan error)

    2. int compareTo(Byte anotherByte)int compareTo(Double anotherDouble)int compareTo(Float anotherFloat)int compareTo(Integer anotherInteger)int compareTo(Long anotherLong)int compareTo(Short anotherShort)

      perbandingan ke int dan hasil nya lebih besar,kecil, dll

    3. byte byteValue()short shortValue()int intValue()long longValue()float floatValue()double doubleValue()

      menghasilkan value dengan tipe datanya masing2 (disebelah paling kiri)

    Annotators

    1. animalCage = lionCage; // compile-time erroranimalCage = butterflyCage

      ini gabisa karena lion ya harus ke lionCage, butterfly juga, kalo ini bisa, lion bisa jadi bfly berantakan lah.

      so harus presisi karena supertypenya bukan Cage<Animal> tapi Cage<? extends Animal>

    Annotators

    1. U

      intinya ini bakal menyesuaikan, compiler akan menentukan tipe generic itu gimana masukannya, kalo dikasus ini red berarti tipenya crayon.

      intinya U ini biar list nya bisa tipe object apa aja ga eksak saatu tipe doang

    2. Generic
      • Ini contoh type inference di Java, yaitu compiler menebak tipe generic otomatis
      • Ada method generic:<br /> java public static <U> void fillBoxes(U u, List<Box<U>> boxes)
      • Method ini menerima satu data bertipe U dan list berisi Box<U>
      • Dalam method, setiap box diisi data u dengan box.add(u)

      • Saat dipanggil:<br /> java Crayon red = ...; List<Box<Crayon>> crayonBoxes = ...;

      • red bertipe Crayon
      • crayonBoxes adalah list berisi Box<Crayon>

      • Ada dua cara panggil method:

      • Secara eksplisit:<br /> java Box.<Crayon>fillBoxes(red, crayonBoxes);
        • Kita sebutkan tipe genericnya (Crayon) secara langsung
      • Secara implisit:<br /> java Box.fillBoxes(red, crayonBoxes);

        • Compiler menebak sendiri bahwa U adalah Crayon
        • Karena red bertipe Crayon dan crayonBoxes bertipe List<Box\<Crayon>>
      • Manfaat type inference:

      • Lebih ringkas
      • Tidak perlu tulis tipe generic secara eksplisit
      • Compiler otomatis cocokkan tipe data yang dipakai

      • Intinya:

      • Java bisa menebak tipe generic dari parameter yang diberikan
      • Bikin kode lebih simpel dan bersih
    3. Generic
      • Betul, class Box di sini dideklarasikan secara umum (pakai tipe Object)
      • Jadi, Box bisa menyimpan objek tipe apa saja (Integer, String, dll)
      • Tapi, saat ambil datanya, kita harus casting ke tipe asli (misal Integer)
      • Ini kurang aman, karena kalau salah casting bisa error saat runtime

      • Dengan generics, kita bisa buat Box yang khusus untuk tipe tertentu

      • Contoh:<br /> java Box<Integer> integerBox = new Box<>();
      • Java tahu Box ini hanya untuk Integer
      • Saat ambil data, tidak perlu casting lagi:<br /> java Integer someInteger = integerBox.get();
      • Lebih aman dan jelas tipe datanya
      • Intinya, generics bikin class lebih spesifik dan mengurangi error saat runtime
    4. Box
      • Betul, class Box di sini dideklarasikan secara umum (pakai tipe Object)
      • Jadi, Box bisa menyimpan objek tipe apa saja (Integer, String, dll)
      • Tapi, saat ambil datanya, kita harus casting ke tipe asli (misal Integer)
      • Ini kurang aman, karena kalau salah casting bisa error saat runtime

      • Dengan generics, kita bisa buat Box yang khusus untuk tipe tertentu

      • Contoh:<br /> java Box<Integer> integerBox = new Box<>();
      • Java tahu Box ini hanya untuk Integer
      • Saat ambil data, tidak perlu casting lagi:<br /> java Integer someInteger = integerBox.get();
      • Lebih aman dan jelas tipe datanya
      • Intinya, generics bikin class lebih spesifik dan mengurangi error saat runtime

    Annotators

    1. Deer d = new Deer();Animal a = d;Vegetarian v = d;Object o = d;

      Intinya: Tanpa baris-baris itu, class Deer tetap: subclass dari Animal implementasi dari Vegetarian subclass dari Object (secara implisit) Baris-baris itu hanya contoh bahwa polimorfisme di Java memungkinkan objek Deer diperlakukan sebagai: Animal Vegetarian Object

    Annotators

    Annotators

    1. Kelas Abstrak: kelas yang tidak bisa diinstansiasi

      ini biasanya secara logika ada tapi gaada objek yang cocok untuk abstrak kelas tsb.

      gabisa dibuat objek untuk kelas ini.

      class Mobil { // atribut dan method }

      // instansiasi: Mobil m = new Mobil();

    Annotators

    Annotators