JavaRush /Java Blog /Random-ID /Rehat kopi #88. Kekuatan metadata: cara bekerja dengan ko...

Rehat kopi #88. Kekuatan metadata: cara bekerja dengan kode spageti. Pengumpulan sampah di Java - cara kerjanya dan apa kelebihannya

Dipublikasikan di grup Random-ID

Kekuatan metadata: cara bekerja dengan kode spageti

Sumber: Hackernoon Kita semua mencoba menggunakan pendekatan umum dan pola yang diketahui untuk membuat aplikasi dengan sedikit usaha dan dampak maksimal. Kami memiliki perpustakaan yang sangat baik dan kerangka kerja yang kuat yang melakukan operasi rutin untuk kami. Kami menggunakan semua ini untuk fokus hanya pada logika bisnis. Namun, upaya ini sering kali mengarahkan kita pada kode spageti, terutama saat mengimplementasikan suatu fungsi tanpa solusi siap pakai. Pada artikel ini, saya ingin berbagi dengan Anda satu alat canggih yang, menurut pengalaman saya, tidak semua pengembang menghargainya. Alat ini hadir di sebagian besar bahasa pemrograman, dan sangat sering digunakan di banyak kerangka kerja - anotasi. Rehat kopi #88.  Kekuatan metadata: cara bekerja dengan kode spageti.  Pengumpulan sampah di Java - cara kerjanya dan apa kelebihannya - 1

Apakah kamu suka spageti?

Mari kita lihat contoh yang saya temui beberapa tahun lalu. Saya perlu mengurai spreadsheet Excel untuk memasukkan data yang telah diurai ke dalam database. Saya juga ingin mengumpulkan beberapa data dari database dan membuat spreadsheet. Untuk implementasinya, saya menggunakan perpustakaan Java yang terkenal - Apache POI. API perpustakaan membuat pekerjaan Anda lebih mudah karena memungkinkan Anda membuat lembar, baris, sel, dan elemen lainnya secara manual. Ini sangat bagus, tetapi ketika diperlukan untuk membuat berbagai spreadsheet Excel, kode menjadi tidak dapat dibaca dan didukung sepenuhnya. Akibatnya, seperti yang biasanya terjadi, versi pertama aplikasi tersebut menjadi sangat buruk. Implementasinya terdiri dari kelas data yang mewakili string dengan semua bidang yang diperlukan untuk penguraian. Ada juga parser di mana bidang Excel diurai sel demi sel dan ditempatkan ke dalam instance kelas data yang baru dibuat. Pada awalnya program ini bekerja dengan baik dan melakukan apa yang diminta. Masalah dimulai ketika tiba waktunya untuk melakukan beberapa modifikasi; kodenya tidak terbaca. Bahkan saya, yang menulis kode ini, tidak dapat menemukan tempat yang cocok untuk menempatkan baris baru guna mengimplementasikan fungsi baru yang saya perlukan.

Penyelamatan dalam anotasi

Menyimpan aplikasi dari kode spageti anotasi ini. Untuk menghilangkan kode yang tidak didukung, saya perlu memindahkan logika untuk menentukan kolom mana yang akan diurai, tipe data apa yang terdapat dalam sel, dan yang lainnya ke lokasi berbeda. Untuk melakukan ini, saya membuat anotasi di mana saya menentukan nama kolom untuk setiap bidang kelas. Dalam anotasinya, saya juga menambahkan variabel yang memungkinkan Anda memilih warna dan font sel. Dengan demikian, kode di kelas parsing telah dikurangi secara signifikan. Hanya satu prosesor yang secara dinamis membuat spreadsheet berdasarkan parameter yang diambil dari anotasi. Itu adalah sebuah kemenangan. Kemudian, untuk melakukan perubahan apa pun pada aplikasi, saya hanya perlu membuat kelas dengan anotasi. Solusinya mengingatkan pada perpustakaan Jackson, yang mem-parsing JSON menggunakan anotasi, dan menurut saya tidak perlu mengatakan betapa nyamannya Jackson atau perpustakaan serupa.
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ColumnExcel {

    String name() default "";

    int position();

    ExcelColumnDataFormat cellTypePattern() default ExcelColumnDataFormat.NONE;

    IndexedColors cellColor() default IndexedColors.AUTOMATIC;

    ExcelTotalFormula total() default ExcelTotalFormula.NONE;

}
ColumnExcel columnExcel = field.getAnnotation(ColumnExcel.class);
Seiring berkembangnya aplikasi, aplikasi menerima anotasi baru yang dapat digunakan untuk membuat sel dalam spreadsheet dengan fungsi di dalamnya. Berbagai bidang dapat dikalikan, dikurangi, dan fungsi umum Excel apa pun dapat digunakan. Saya juga menambahkan baris total untuk menampilkan jumlah berdasarkan kolom. Dan saya melakukan semua ini hanya dengan sedikit memodifikasi parser utama dan menambahkan anotasi ke kelas.
@ColumnExcel(
            name = "Views",
            position = 4,
            total = ExcelTotalFormula.SUM)
    private BigDecimal variableC;

    @ColumnExcelFormula(
            name = "Conversion",
            position = 5,
            cellTypePattern = CellDataTypeFormatPattern.PERCENTAGE
    )
    public String variableD(int rowNumber) {
        return new CellAddress(rowNumber, 4).formatAsString() + "*"
		+ new CellAddress(rowNumber, 2).formatAsString();
    }

    @ColumnExcelTotalFormula(position = 4, cellTypePattern = CellDataTypeFormatPattern.RUR)
    public static String getVariableCTotalFormula(int firstRowNum, int lastRowNum) {
        return "SUM( " + new CellAddress(firstRowNum, 4).formatAsString() + ":"
		+ new CellAddress(lastRowNum, 4).formatAsString() + ")";
    }

Pengumpulan sampah di Java - cara kerjanya dan apa kelebihannya

Sumber: Dev.to Pengumpulan sampah berarti menghancurkan atau membersihkan objek-objek yang tidak terpakai di memori. Java menangani dealokasi memori secara otomatis karena setelah sebuah objek dibuat, ia menggunakan sejumlah memori di heap. Rehat kopi #88.  Kekuatan metadata: cara bekerja dengan kode spageti.  Pengumpulan sampah di Java - cara kerjanya dan apa kelebihannya - 2

Bagaimana itu bekerja?

Sebelum Java, bahasa pemrograman yang paling populer adalah C atau C++. Jika Anda berbicara bahasa-bahasa ini, maka Anda harus tahu bahwa mereka mengelola memorinya sendiri secara manual. Misalnya, C memiliki metode seperti calloc() , malloc() dan realloc() yang memungkinkan Anda menggunakan memori buffer. Anda harus menentukan berapa banyak memori yang Anda butuhkan untuk program Anda dan menentukan apa yang disebut dengan API ini. Anda kemudian bisa mendapatkan buffer memori untuk membuat node daftar tertaut atau yang lainnya. Ketika program Anda berakhir, pada titik tertentu, Anda juga bertanggung jawab untuk membersihkan memori tersebut. Jadi aplikasi besar yang ditulis dalam C terus mengalokasikan memori buffer dan terkadang lupa untuk membilasnya. Hal ini pada akhirnya menyebabkan kebocoran memori dan banyak masalah pada aplikasi. Berbeda dengan C dan C++, bahasa Java hadir dengan manajemen memori otomatis melalui thread yang disebut pengumpul sampah. Tujuan utamanya adalah untuk mengosongkan memori heap dengan menghancurkan objek yang tidak dapat diakses. Pengumpul sampah selalu berjalan di latar belakang.

Apa saja objek yang tidak dapat diakses di Java?

Kapan suatu objek mendapat kesempatan untuk memulai pengumpulan sampah? Jika ada objek yang tidak dapat diakses - objek yang tidak memiliki tautan aktif. Mari kita lihat contohnya:
public static void main(String[] args)
{
// StringBuffer object sb is not eligible for garbage collection
StringBuffer sb = new StringBuffer("Flower Brackets");
System.out.println(sb);
// StringBuffer object sb is eligible for garbage collection
sb = null;
}
Dalam metode utama saya membuat objek StringBuffer dan referensi ke sana. Pada titik ini, objek StringBuffer tidak memenuhi syarat untuk pengumpulan sampah. Sekarang saya akan menyetel objek StringBuffer ke "null". Objek tersebut sekarang memenuhi syarat untuk pengumpulan sampah dan menjadi objek yang tidak dapat diakses di memori heap. Artinya, pengumpulan sampah umumnya berfungsi jika objek tidak dapat diakses. Ini berarti bahwa objek biasanya dibuat dalam konteks “blok if” atau metode. Dengan demikian, objek keluar dari ruang lingkup setelah eksekusi metode selesai dan dapat dibuang oleh pengumpul sampah. Karena referensi dari objek lama ke objek baru jumlahnya terbatas, artinya objek yang sudah lama ada di aplikasi Anda biasanya bukan objek yang baru dibuat. Berikut beberapa istilah yang harus kita pahami; salah satunya adalah benda hidup. Ini adalah objek dalam suatu aplikasi yang direferensikan oleh objek lain dalam aplikasi yang sama. Ada juga benda “mati”. Objek mati adalah objek yang tidak dapat diakses yang dibuat selama pemanggilan metode, dan setelah pemanggilan metode selesai, objek tersebut keluar dari konteks dan hanya berada di heap.

Kapan suatu objek memenuhi syarat untuk pengumpulan sampah?

Jika suatu objek tidak memiliki variabel referensi apa pun, maka objek tersebut memenuhi syarat untuk pengumpulan sampah.

Bagaimana cara membuat objek tersedia untuk pengumpulan sampah?

Di bawah ini beberapa cara:
  1. null reference variable
    Student obj = new Student();
    obj = null;

  2. re-assign reference variable
    Student obj1 = new Student();
    Student obj2 = new Student();
    obj1 = obj2;

  3. reate anonymous object
    new Student();

    Setelah suatu benda diserahkan kepada pemulung, benda tersebut tidak langsung dimusnahkan.

Saat Mesin Virtual Java menjalankan pengumpul sampah, hanya objek yang dimusnahkan. CATATAN: Pengumpul sampah hanya mengumpulkan objek yang dibuat dengan kata kunci “baru”, untuk objek tanpa kata kunci “baru”, gunakan metode finalize() . Ada beberapa metode untuk menjalankan pengumpul sampah di Java Virtual Machine:
  1. Metode Sistem.gc()

  2. menyelesaikan() metode

  3. Metode Runtime.getRuntime().gc()

Metode statis gc() terletak di kelas Sistem . Metode ini meminta JVM untuk memanggil pengumpul sampah. Mari kita lihat bagaimana aplikasi Java memanggil pengumpul sampah menggunakan metode gc() .
public class GarbageCollector
{
public static void main(String[] args)
{
Employee obj1 = new Employee();
Employee obj2 = new Employee();
obj1 = null;
obj2 = null;
System.gc();
}
public void finalize()
{
System.out.println("object garbage collected");
}
}
Hasil:
objek sampah yang dikumpulkan objek sampah yang dikumpulkan
Metode finalize() dipanggil tepat sebelum objek dibersihkan. Metode ini didefinisikan dalam kelas Object :
protected void finalize() throws Throwable
  1. Metode Finalize digunakan untuk menutup koneksi ke database.

  2. Metode ini dipanggil oleh pengumpul sampah, bukan JVM.

  3. Kita perlu mengganti metode finalize() . Karena implementasinya kosong.

  4. Itu dipanggil hanya sekali per objek.

Metode getRuntime().gc() ada di kelas runtime. Ia mengembalikan objek Runtime yang terkait dengan aplikasi Java saat ini. Mari kita lihat metode ini dalam program Java.
public class Demo
{
public static void main(String[] args)
{
Demo obj1 = new Demo();
Demo obj2 = new Demo();
// nullifying reference variable
obj1 = null;
// nullifying reference variable
obj2 = null;
// running Garbage Collector
Runtime.getRuntime().gc();
}
@Override
protected void finalize() throws Throwable
{
System.out.println("Garbage collector called");
System.out.println("Object garbage collector: " + this);
}
}
Hasil:
Pengumpul sampah disebut Pengumpul sampah objek: Demo@2130772 Pengumpul sampah disebut Pengumpul sampah objek: Demo@cd4e940

Manfaat pengumpulan sampah:

  1. Pengumpulan sampah di Java terjadi secara otomatis, sehingga menyelamatkan kita dari beban tambahan untuk mengosongkan memori yang terpakai. Hal ini membuat memori program Java lebih efisien.
  2. Pengumpulan sampah memastikan integritas program.
  3. Kita tidak perlu menulis kode tambahan apa pun karena pengumpul sampah adalah bagian dari JVM.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION