JavaRush /Blog Jawa /Random-JV /Ngopi #88. Kekuwatan metadata: cara nggarap kode spageti....

Ngopi #88. Kekuwatan metadata: cara nggarap kode spageti. Ngumpulake sampah ing Jawa - cara kerjane lan apa kaluwihane

Diterbitake ing grup

Kekuwatan metadata: cara nggarap kode spageti

Sumber: Hackernoon Kita kabeh nyoba nggunakake pendekatan umum lan pola sing dikenal kanggo nggawe aplikasi kanthi gaweyan minimal lan pengaruh maksimal. Kita duwe perpustakaan sing apik lan kerangka kerja sing kuat sing nindakake operasi rutin kanggo kita. Kita nggunakake kabeh iki kanggo fokus mung ing logika bisnis. Nanging, nguber iki asring ndadékaké kita menyang kode spageti, utamané nalika nerangake ngleksanakake fungsi tanpa solusi siap-digawe kanggo iku. Ing artikel iki, aku pengin nuduhake karo sampeyan alat sing kuat sing, ing pengalamanku, ora kabeh pangembang ngurmati. Alat iki ana ing pirang-pirang basa pamrograman, lan asring digunakake ing pirang-pirang kerangka kerja - anotasi. Ngopi #88.  Kekuwatan metadata: cara nggarap kode spageti.  Ngumpulake sampah ing Jawa - cara kerjane lan apa kaluwihane - 1

Apa sampeyan seneng spageti?

Ayo goleki conto sing daktemoni sawetara taun kepungkur. Aku kudu ngurai spreadsheet Excel kanggo nyelehake data sing diurai menyang database. Aku uga pengin ngumpulake sawetara data saka database lan nggawe spreadsheet. Kanggo implementasine, aku nggunakake perpustakaan Java sing kondhang - Apache POI. API perpustakaan nggawe karya luwih gampang amarga ngidini sampeyan nggawe sheet, baris, sel, lan unsur liyane kanthi manual. Iki apik banget, nanging nalika perlu kanggo ngasilake macem-macem spreadsheet Excel, kode kasebut dadi ora bisa diwaca lan ora bisa didhukung. Akibaté, kaya biasane, versi pisanan saka aplikasi dadi mung elek. Implementasine kalebu kelas data sing makili senar kanthi kabeh kolom sing dibutuhake kanggo parsing. Ana uga parser ing ngendi kolom Excel diurai sel dening sel lan diselehake menyang conto kelas data sing mentas digawe. Kaping pisanan, program kasebut bisa ditindakake lan nindakake apa sing dibutuhake. Masalah diwiwiti nalika teka wektu kanggo nggawe sawetara modifikasi; kode iki ora diwaca. Malah aku, sing nulis kode iki, ora bisa nemokake panggonan sing cocok kanggo nyeleh baris anyar kanggo ngleksanakake fungsi anyar aku needed.

Nylametake ing anotasi

Aplikasi kasebut disimpen saka kode spageti anotasi iki. Kanggo nyisihake kode sing ora didhukung, aku kudu mindhah logika kanggo nemtokake kolom sing bakal diurai, jinis data sing ana ing sel, lan liya-liyane menyang lokasi sing beda. Kanggo nindakake iki, aku nggawe anotasi ing ngendi aku nemtokake jeneng kolom kanggo saben lapangan kelas. Ing anotasi, aku uga nambahake variabel sing ngidini sampeyan milih warna lan font sel. Mangkono, kode ing kelas parsing wis suda sacara signifikan. Mung siji prosesor kanthi dinamis nggawe spreadsheet adhedhasar paramèter sing dijupuk saka anotasi. Iku kamenangan. Banjur, kanggo nggawe owah-owahan ing aplikasi, aku mung kudu nggawe kelas kanthi anotasi. Solusi kasebut kaya perpustakaan Jackson, sing ngurai JSON nggunakake anotasi, lan aku ora perlu ngandhani kepiye Jackson utawa perpustakaan sing padha.
@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);
Nalika aplikasi kasebut berkembang, aplikasi kasebut nampa anotasi anyar sing bisa digunakake kanggo nggawe sel ing spreadsheet kanthi fungsi ing njero. Macem-macem kolom bisa dikalikan, dikurangi, lan fungsi Excel sing umum bisa digunakake. Aku uga nambah baris total kanggo nuduhake jumlah dening kolom. Lan aku nindakake kabeh iki mung kanthi ngowahi parser utama lan mung nambah anotasi ing 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() + ")";
    }

Ngumpulake sampah ing Jawa - cara kerjane lan apa kaluwihane

Sumber: Koleksi sampah Dev.to tegese ngrusak utawa ngresiki obyek sing ora digunakake ing memori. Jawa nangani deallocation memori kanthi otomatis amarga yen obyek digawe, nggunakake sawetara memori ing numpuk. Ngopi #88.  Kekuwatan metadata: cara nggarap kode spageti.  Ngumpulake sampah ing Jawa - cara kerjane lan apa kaluwihane - 2

Cara kerjane?

Sadurunge Java, basa pemrograman sing paling populer yaiku C utawa C++. Yen sampeyan nggunakake basa kasebut, sampeyan kudu ngerti manawa dheweke ngatur memori dhewe kanthi manual. Contone, C wis cara kayata calloc () , malloc () lan realloc () sing bakal ngidini sampeyan nggunakake memori buffer. Sampeyan kudu nemtokake jumlah memori sing dibutuhake kanggo program lan nemtokake apa sing diarani API iki. Sampeyan banjur bisa njaluk buffer memori kanggo nggawe simpul dhaftar disambung utawa liyane. Nalika program sampeyan mungkasi, ing sawetara titik, sampeyan uga tanggung jawab kanggo ngresiki memori kasebut. Dadi aplikasi gedhe sing ditulis ing C tetep nyedhiakke memori buffer lan kadhangkala lali kanggo siram. Iki pungkasane nyebabake bocor memori lan akeh masalah ing aplikasi kasebut. Ora kaya C lan C ++, basa Jawa dilengkapi manajemen memori otomatis liwat benang sing diarani pengumpul sampah. Tujuan utamane yaiku mbebasake memori tumpukan kanthi ngrusak obyek sing ora bisa diakses. Pengumpul sampah tansah mlaku ing latar mburi.

Apa obyek sing ora bisa diakses ing basa Jawa?

Nalika obyek entuk kesempatan kanggo miwiti ngumpulake sampah? Yen ana obyek sing ora bisa diakses - sing ora ana pranala aktif. Ayo ndeleng conto:
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;
}
Ing cara utama aku nggawe obyek StringBuffer lan referensi kanggo. Ing wektu iki, obyek StringBuffer ora layak kanggo koleksi sampah. Saiki aku bakal nyetel obyek StringBuffer dadi "null". Objek kasebut saiki layak kanggo koleksi sampah lan dadi obyek sing ora bisa diakses ing memori tumpukan. Tegese, pangumpulan sampah umume bisa digunakake nalika obyek dadi ora bisa diakses. Iki tegese obyek biasane digawe ing konteks "yen blok" utawa metode. Mangkono, obyek metu saka ruang lingkup sawise eksekusi metode rampung lan bisa dibuwang dening tukang sampah. Amarga referensi saka obyek lawas menyang anyar ana ing jumlah winates, iki tegese obyek sing wis ana ing aplikasi kanggo dangu biasane ora anyar digawe obyek. Ing ngisor iki sawetara istilah sing kudu kita kenal; salah sijine yaiku obyek urip. Iki minangka obyek ing aplikasi sing dirujuk dening obyek liyane ing aplikasi sing padha. Ana uga obyek "mati". Obyek mati minangka obyek sing ora bisa diakses sing digawe sajrone nelpon metode, lan yen panggilan metode rampung, obyek kasebut metu saka konteks lan mung lungguh ing tumpukan.

Nalika obyek layak kanggo koleksi sampah?

Yen obyek ora duwe variabel referensi, obyek kasebut layak kanggo koleksi sampah.

Kepiye carane nyedhiyakake obyek kanggo koleksi sampah?

Ing ngisor iki ana sawetara 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();

    Sawise obyek kasedhiya kanggo tukang sampah, ora langsung dirusak.

Nalika Mesin Virtual Java mbukak kolektor sampah, mung obyek sing rusak. CATETAN: Penagih uwuh mung ngumpulake obyek digawe nggunakake tembung kunci "anyar", kanggo obyek tanpa tembung kunci "anyar", nggunakake cara finalize () . Ana sawetara cara kanggo mbukak pengumpul sampah ing Java Virtual Machine:
  1. System.gc() metode

  2. metode finalize().

  3. Runtime.getRuntime().gc() metode

Metode gc statis () dumunung ing kelas Sistem . Cara iki njaluk JVM nelpon tukang sampah. Ayo ndeleng carane aplikasi Java nelpon tukang sampah nggunakake 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");
}
}
asil:
obyek sampah dikumpulake obyek sampah dikumpulake
Cara finalize () diarani sadurunge obyek diresiki. Cara iki ditetepake ing kelas Obyek :
protected void finalize() throws Throwable
  1. Cara Finalize digunakake kanggo nutup sambungan menyang database.

  2. Cara iki diarani tukang sampah, dudu JVM.

  3. Kita kudu ngilangi metode finalize () . Amarga nduweni implementasine kosong.

  4. Iki diarani mung sapisan saben obyek.

Metode getRuntime () .gc () ana ing kelas runtime. Iki ngasilake obyek Runtime sing digandhengake karo aplikasi Java saiki. Ayo ndeleng cara iki ing 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);
}
}
asil:
Pengumpul sampah disebut Pengumpul sampah Objek: Demo@2130772 Pengumpul sampah diarani Pengumpul sampah Objek: Demo@cd4e940

Keuntungan saka koleksi sampah:

  1. Koleksi sampah ing Jawa dumadi kanthi otomatis, sing nylametake kita saka beban tambahan kanggo mbebasake memori sing digunakake. Iki ndadekake memori program Jawa luwih efisien.
  2. Ngumpulake sampah njamin integritas program.
  3. Kita ora perlu nulis kode tambahan amarga tukang sampah minangka bagéan saka JVM.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION