Di java dan C# (karena cuman didalam bahasa itu yang saya tau), terdapat keyword:
final menunjukkan bahwa class/method/variable yang dideclare dengan keyword final tidak dapat di override ataupun diubah valuenya (khusus untuk variable). Keyword final tidak dapat digabungkan dengan keyword abstract, karena sifatnya bertentangan (compile-error).
Karakteristik final:
- Biasanya digunakan untuk deklarasi konstan digabungkan dengan static keyword. Contoh: public static final MOVE = 1;
- Pengubahan value terhadap variable final; override dan overloading method; pewarisan/inheritance final class akan terjadi compile-error.
abstract menunjukkan bahwa class/method (agak lupa abstract variable ada di C# apa tidak) bersifat abstrak yang memaksa subclass / child nya untuk mengimplementasi method/class tersebut, jika tidak maka akan terjadi compile-error.
Karakteristik abstract:
- Harus di-implemen / di override oleh subclass / child nya, jika tidak akan compile error.
- Untuk abstract class, memiliki karakteristik yang serupa dengan interface tapi tidak sama.
- Tidak ada abstract variable dalam Java. (CMIIW)
- abstract class dapat memiliki konkrit method (tidak abstract), ini merupakan salah satu pembeda dengan interface.
Dahulu saya paling kesulitan memahami static keyword, namun beruntung sekarang saya sudah cukup paham tentang static, sebelum itu anda harus paham istilah dibawah ini:
instance = representasi/contoh/bentuk dari blueprint yang ada. Contohnya seperti Budi adalah representasi dari Manusia.
instantiate = istilah dari pembuatan untuk 1 instance.
static menunjukkan bahwa class/method/variable yang didefinisikan sebagai static hanya memiliki 1 instance untuk semua. Contohnya adalah dalam pembuatan object X terhadap class HURUF (1 atau lebih object), hanya akan ada 1 instance static method/variable yang dibuat/digenerate untuk 1 object tersebut. Method/variable static tsb adalah milik class HURUF, bukan milik object X, sehingga semua object akan mengakses 1 instance static yang sama milik class HURUF.
static sangat sering digunakan
Karakteristik static:
- static keyword sering digabungkan dengan final untuk pembuatan konstan.
- Class dapat bersifat static, namun setiap member class harus bersifat static (mengikuti aturan dan fungsi dari static keyword), tidak mungkin bukan class yang hanya ada 1 instance dalam JVM, tetapi member class nya bisa lebih dari 1 instance?
- static metod tidak dapat mengakses non-static method/variable.
- static method dapat mengakses static method/variable.
- Untuk mengakses non-static method/variable, harus melakukan instantiate terlebih dahulu.
Prinsip diatas sesuai dengan fungsi dari static keyword. Bukankah sangat aneh bahwa 1 instance yang konkrit (static) memiliki instance yang tidak konkrit / belum jelas? untuk mengaksesnya maka harus dilakukan instantiated terlebih dahulu.
Semoga informasi ini berguna untuk anda.
Jika ada salah, mohon koreksinya :)
Maksud hati hanya mao sharing yang saya tau kok :D
Just a collection of notes (documentation purpose) that past over in my life.. I just want to shared what I've got and pour it on this blog ^^
Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts
Saturday, January 14, 2012
Sunday, December 25, 2011
Mutable, Immutable, Thread Safe, Not-Thread Safe
Just notes:
Mutable adalah objek yang ketika dibuat (instantiate), dapat dirubah isinya.
Immutable adalah kebalikan dari Mutable, ketika sudah di instantiated maka objek tersebut tidak dapat dirubah isinya. Contoh paling umum adalah objek String.
Contoh pada Java, kita harus berhati-hati dalam menggunakan String karena objek ini sifatnya immutable. Pada saat anda mendeklarasikan String kata = "Saya immutable", JVM akan membuat 1 objek immutable.
Ketika anda melakukan perubahan: kata = "Saya mutable" anda sebenarnya melakukan pembuatan objek baru lagi dengan variable "kata" dan isi "Saya mutable" namun pada alokasi memori yang berbeda dari variable sebelumnya. Jika terlalu banyak operasi seperti itu, dapat mempengaruhi performance.
Jika anda akan melakukan banyak perubahan atau penambahan kalimat pada String objek, biasakan menggunakan class StringBuilder atau StringBuffer, lalu pada akhir manipulasi tersebut ubah menjadi String.
Perbedaan StringBuilder dan StringBuffer hanya pada Thread Safe (String Buffer) dan Not-Thread Safe (String Builder).
Thread Safe adalah konsep yang menjelaskan jika terdapat 1 resource yang digunakan bersama pada satu waktu (shared resource) tidak memberikan hasil yang berbeda / tidak sinkron. Thread Safe dapat diartikan dengan synchronization. Sehingga terdapat aksi wait() terhadap resource yang dipegang oleh banyak thread.
Not-Thread Safe adalah kebalikan dari Thread Safe, jika ada 2 thread yang menggunakan 1 resource (shared resource) maka hasil/value yang diberikan bisa berbeda/tidak sinkron, tergantung siapa yang lebih dahulu mememegang resource tsb (hold / lock the resource).
Contoh kasus seperti ini:
Misal ada Objek X, resource A, resource B, perintah 1-2 pada Objek X.
1. Objek X di akses oleh dua thread A dan B
2. Objek X dipegang oleh A, melakukan 1 perintah terhadapa objek X, ketika selesai nilai Objek X berubah.
3. Objek X kemudian diakses oleh B setelah setelah perintah 1 diekseskusi A, objek X nilainya akan berubah setelah dieksekusi oleh B (perintah 1 diekseskusi oleh B).
4. Karena thread A agak lama, maka B tetap mengakses objek X dan mengeksekusi perintah 2 terhadap objek X, nilai objek X berubah.
5. Objek X kemudian diakses kembali oleh thread A untuk mengeksekusi perintah 2, value apa yang diperoleh oleh A pada saat diakses kali ini?
- Jawaban tergantung pada Thread Safe dan Not Thread Safe.
Karena alokasi objek X terdapat pada alamat memori yang sama, maka pada langkah 5 nilai sebenarnya adalah: objek X setelah diekseskusi oleh B.
Jika Thread Safe, maka A akan membaca nilai objek X dimana dia terakhir diubah oleh B.
Jika, Not Thread Safe maka nilai objek X yang dibaca adalah nilai objek X yang terakhir diubah oleh A.
Semoga penjelasan ini bisa dimengerti.
Sebenarnya lebih enak pakai gambar :D
Jika ada salah, mohon koreksinya :) Maksud hati hanya mao sharing yang saya tau kok :D
Mutable adalah objek yang ketika dibuat (instantiate), dapat dirubah isinya.
Immutable adalah kebalikan dari Mutable, ketika sudah di instantiated maka objek tersebut tidak dapat dirubah isinya. Contoh paling umum adalah objek String.
Contoh pada Java, kita harus berhati-hati dalam menggunakan String karena objek ini sifatnya immutable. Pada saat anda mendeklarasikan String kata = "Saya immutable", JVM akan membuat 1 objek immutable.
Ketika anda melakukan perubahan: kata = "Saya mutable" anda sebenarnya melakukan pembuatan objek baru lagi dengan variable "kata" dan isi "Saya mutable" namun pada alokasi memori yang berbeda dari variable sebelumnya. Jika terlalu banyak operasi seperti itu, dapat mempengaruhi performance.
Jika anda akan melakukan banyak perubahan atau penambahan kalimat pada String objek, biasakan menggunakan class StringBuilder atau StringBuffer, lalu pada akhir manipulasi tersebut ubah menjadi String.
Perbedaan StringBuilder dan StringBuffer hanya pada Thread Safe (String Buffer) dan Not-Thread Safe (String Builder).
Thread Safe adalah konsep yang menjelaskan jika terdapat 1 resource yang digunakan bersama pada satu waktu (shared resource) tidak memberikan hasil yang berbeda / tidak sinkron. Thread Safe dapat diartikan dengan synchronization. Sehingga terdapat aksi wait() terhadap resource yang dipegang oleh banyak thread.
Not-Thread Safe adalah kebalikan dari Thread Safe, jika ada 2 thread yang menggunakan 1 resource (shared resource) maka hasil/value yang diberikan bisa berbeda/tidak sinkron, tergantung siapa yang lebih dahulu mememegang resource tsb (hold / lock the resource).
Contoh kasus seperti ini:
Misal ada Objek X, resource A, resource B, perintah 1-2 pada Objek X.
1. Objek X di akses oleh dua thread A dan B
2. Objek X dipegang oleh A, melakukan 1 perintah terhadapa objek X, ketika selesai nilai Objek X berubah.
3. Objek X kemudian diakses oleh B setelah setelah perintah 1 diekseskusi A, objek X nilainya akan berubah setelah dieksekusi oleh B (perintah 1 diekseskusi oleh B).
4. Karena thread A agak lama, maka B tetap mengakses objek X dan mengeksekusi perintah 2 terhadap objek X, nilai objek X berubah.
5. Objek X kemudian diakses kembali oleh thread A untuk mengeksekusi perintah 2, value apa yang diperoleh oleh A pada saat diakses kali ini?
- Jawaban tergantung pada Thread Safe dan Not Thread Safe.
Karena alokasi objek X terdapat pada alamat memori yang sama, maka pada langkah 5 nilai sebenarnya adalah: objek X setelah diekseskusi oleh B.
Jika Thread Safe, maka A akan membaca nilai objek X dimana dia terakhir diubah oleh B.
Jika, Not Thread Safe maka nilai objek X yang dibaca adalah nilai objek X yang terakhir diubah oleh A.
Semoga penjelasan ini bisa dimengerti.
Sebenarnya lebih enak pakai gambar :D
Jika ada salah, mohon koreksinya :) Maksud hati hanya mao sharing yang saya tau kok :D
Monday, May 30, 2011
Common Keyword OOP (Static, Final, Abstract)
Di java dan C# (karena cuman didalam bahasa itu yang saya tau), terdapat keyword:
final menunjukkan bahwa class/method/variable yang dideclare dengan keyword final tidak dapat di override ataupun diubah valuenya (khusus untuk variable). Keyword final tidak dapat digabungkan dengan keyword abstract, karena sifatnya bertentangan (compile-error).
Karakteristik final:
- Biasanya digunakan untuk deklarasi konstan digabungkan dengan static keyword. Contoh: public static final MOVE = 1;
- Pengubahan value terhadap variable final; override dan overloading method; pewarisan/inheritance final class akan terjadi compile-error.
abstract menunjukkan bahwa class/method (agak lupa abstract variable ada di C# apa tidak) bersifat abstrak yang memaksa subclass / child nya untuk mengimplementasi method/class tersebut, jika tidak maka akan terjadi compile-error.
Karakteristik abstract:
- Harus di-implemen / di override oleh subclass / child nya, jika tidak akan compile error.
- Untuk abstract class, memiliki karakteristik yang serupa dengan interface tapi tidak sama.
- Tidak ada abstract variable dalam Java. (CMIIW)
- abstract class dapat memiliki konkrit method (tidak abstract), ini merupakan salah satu pembeda dengan interface.
Dahulu saya paling kesulitan memahami static keyword, namun beruntung sekarang saya sudah cukup paham tentang static, sebelum itu anda harus paham istilah dibawah ini:
instance = representasi/contoh/bentuk dari blueprint yang ada. Contohnya seperti Budi adalah representasi dari Manusia.
instantiate = istilah dari pembuatan untuk 1 instance.
static menunjukkan bahwa class/method/variable yang didefinisikan sebagai static hanya memiliki 1 instance untuk semua. Contohnya adalah dalam pembuatan object X terhadap class HURUF (1 atau lebih object), hanya akan ada 1 instance static method/variable yang dibuat/digenerate untuk 1 object tersebut. Method/variable static tsb adalah milik class HURUF, bukan milik object X, sehingga semua object akan mengakses 1 instance static yang sama milik class HURUF.
static sangat sering digunakan
Karakteristik static:
- static keyword sering digabungkan dengan final untuk pembuatan konstan.
- Class dapat bersifat static, namun setiap member class harus bersifat static (mengikuti aturan dan fungsi dari static keyword), tidak mungkin bukan class yang hanya ada 1 instance dalam JVM, tetapi member class nya bisa lebih dari 1 instance?
- static metod tidak dapat mengakses non-static method/variable.
- static method dapat mengakses static method/variable.
- Untuk mengakses non-static method/variable, harus melakukan instantiate terlebih dahulu.
Prinsip diatas sesuai dengan fungsi dari static keyword. Bukankah sangat aneh bahwa 1 instance yang konkrit (static) memiliki instance yang tidak konkrit / belum jelas? untuk mengaksesnya maka harus dilakukan instantiated terlebih dahulu.
Semoga informasi ini berguna untuk anda.
Jika ada salah, mohon koreksinya :)
Maksud hati hanya mao sharing yang saya tau kok :D
final menunjukkan bahwa class/method/variable yang dideclare dengan keyword final tidak dapat di override ataupun diubah valuenya (khusus untuk variable). Keyword final tidak dapat digabungkan dengan keyword abstract, karena sifatnya bertentangan (compile-error).
Karakteristik final:
- Biasanya digunakan untuk deklarasi konstan digabungkan dengan static keyword. Contoh: public static final MOVE = 1;
- Pengubahan value terhadap variable final; override dan overloading method; pewarisan/inheritance final class akan terjadi compile-error.
abstract menunjukkan bahwa class/method (agak lupa abstract variable ada di C# apa tidak) bersifat abstrak yang memaksa subclass / child nya untuk mengimplementasi method/class tersebut, jika tidak maka akan terjadi compile-error.
Karakteristik abstract:
- Harus di-implemen / di override oleh subclass / child nya, jika tidak akan compile error.
- Untuk abstract class, memiliki karakteristik yang serupa dengan interface tapi tidak sama.
- Tidak ada abstract variable dalam Java. (CMIIW)
- abstract class dapat memiliki konkrit method (tidak abstract), ini merupakan salah satu pembeda dengan interface.
Dahulu saya paling kesulitan memahami static keyword, namun beruntung sekarang saya sudah cukup paham tentang static, sebelum itu anda harus paham istilah dibawah ini:
instance = representasi/contoh/bentuk dari blueprint yang ada. Contohnya seperti Budi adalah representasi dari Manusia.
instantiate = istilah dari pembuatan untuk 1 instance.
static menunjukkan bahwa class/method/variable yang didefinisikan sebagai static hanya memiliki 1 instance untuk semua. Contohnya adalah dalam pembuatan object X terhadap class HURUF (1 atau lebih object), hanya akan ada 1 instance static method/variable yang dibuat/digenerate untuk 1 object tersebut. Method/variable static tsb adalah milik class HURUF, bukan milik object X, sehingga semua object akan mengakses 1 instance static yang sama milik class HURUF.
static sangat sering digunakan
Karakteristik static:
- static keyword sering digabungkan dengan final untuk pembuatan konstan.
- Class dapat bersifat static, namun setiap member class harus bersifat static (mengikuti aturan dan fungsi dari static keyword), tidak mungkin bukan class yang hanya ada 1 instance dalam JVM, tetapi member class nya bisa lebih dari 1 instance?
- static metod tidak dapat mengakses non-static method/variable.
- static method dapat mengakses static method/variable.
- Untuk mengakses non-static method/variable, harus melakukan instantiate terlebih dahulu.
Prinsip diatas sesuai dengan fungsi dari static keyword. Bukankah sangat aneh bahwa 1 instance yang konkrit (static) memiliki instance yang tidak konkrit / belum jelas? untuk mengaksesnya maka harus dilakukan instantiated terlebih dahulu.
Semoga informasi ini berguna untuk anda.
Jika ada salah, mohon koreksinya :)
Maksud hati hanya mao sharing yang saya tau kok :D
Thursday, May 6, 2010
C# 4.0 - Revolusi Baru di Dynamic Type Object
Belum lama ini gw baca artikel tentang C# 4.0 (terbaru saat tulisan ini dibuat, dengan IDE Visual Studio 2010 dan .NET FRAMEWORK 4.0). Terdapat beberapa feature baru dan perbaikan terhadap salah satu bahasa .Net yang powerful : C#
C# mengalami banyak perbaikan dan perubahan dari sejak pertama diperkenalkan tahun 2000. Pada saat itu C# 1.0 masih sederhana dan biasa.
Kemudian pada C# 2.0, diperkenalkan sebuah konsep penting mengenai "Generics", membawa kita kepada keamanan dalam membuat code (type-safety code), meningkatkan peforma, dan terlihat lebih elegan.
Lalu pada C# 3.0, diperkenalkan kepada revolusi baru mengenai LINQ (Language Integrated Query). Dengan LINQ, paradigma C# menjadi lebih fungsional (bukan sekedar baris perintah / imperative language). Revolusi ini membawa kepada multi paradigma.
Bagaimana dengan sekarang pada C# 4.0 ? Yup, revolusi "Dynamic Programming".
Jika anda pernah membaca / mengetahui / bahkan menguasai sedikit programming language seperti Phyton dan Ruby, maka anda lebih tau tentang apa itu Dynamic Programming.
C# dan beberapa bahasa lainnya seperti Java, adalah strong-type. Dengan adanya feature baru seperti ini, ada beberapa kelebihan yang bisa diperoleh, dan tentunya diimbangi oleh kekurangan yang ditimbulkan oleh revolusi ini.
Fitur baru ini (dynamic type object) sebenarnya mirip-mirip seperti var pada C# 3.0. Tetapi ada seidikit perbedaan disini.
1. var : masih bertipe strong type, artinya masih akan ada compile check. Keyword var ini hanyalah sebuah "pengenal" yang mengatakan bahwa nilai dari variable var tergantung dari apa yang ada di right-hand side (assignmentnya).
Contoh:
- var ganteng = "Relatif";
- var jelek = 0;
Bisa diliat bahwa nilai var tergantung pada assignmentnya.. ganteng (string) dan jelek (integer).
var harus diassign dari awal dan akan terjadi compile error jika terdapat casting yang mustahil.
Selain itu juga untuk mendukung Anonymous Type pada C# 3.0
Contoh:
- var sesuatu = new { NIM = 1000778899 ; Nama = "Katsuki" };
2. dynamic
Nah pada dynamic, tidak akan terjadi compile error karena akan dijalankan pada saat runtime (sama seperti Ruby dan Phyton sebagai Dynamic Programming). Dengan kata lain, baru diketahui errornya pada saat runtime, bukan pada saat compile program.
Hmm.. hal ini sungguh berbahaya namun memiliki kelebihan jika digunakan tepat pada sasaran.. Apa itu contohnya? Well, sampai saat ini, gw sendiri belum pernah dapet case untuk menggunakan dynamic keyword.
(Maklum jam terbang masih rendah...)
Mao tau lebih banyak? Gunakan Search Engine favorit'mu. hehehe
Maaf kalo ada salah, cuman mao sharing yang saya tau :p
Kemudian pada C# 2.0, diperkenalkan sebuah konsep penting mengenai "Generics", membawa kita kepada keamanan dalam membuat code (type-safety code), meningkatkan peforma, dan terlihat lebih elegan.
Lalu pada C# 3.0, diperkenalkan kepada revolusi baru mengenai LINQ (Language Integrated Query). Dengan LINQ, paradigma C# menjadi lebih fungsional (bukan sekedar baris perintah / imperative language). Revolusi ini membawa kepada multi paradigma.
Bagaimana dengan sekarang pada C# 4.0 ? Yup, revolusi "Dynamic Programming".
Jika anda pernah membaca / mengetahui / bahkan menguasai sedikit programming language seperti Phyton dan Ruby, maka anda lebih tau tentang apa itu Dynamic Programming.
C# dan beberapa bahasa lainnya seperti Java, adalah strong-type. Dengan adanya feature baru seperti ini, ada beberapa kelebihan yang bisa diperoleh, dan tentunya diimbangi oleh kekurangan yang ditimbulkan oleh revolusi ini.
Fitur baru ini (dynamic type object) sebenarnya mirip-mirip seperti var pada C# 3.0. Tetapi ada seidikit perbedaan disini.
1. var : masih bertipe strong type, artinya masih akan ada compile check. Keyword var ini hanyalah sebuah "pengenal" yang mengatakan bahwa nilai dari variable var tergantung dari apa yang ada di right-hand side (assignmentnya).
Contoh:
- var ganteng = "Relatif";
- var jelek = 0;
Bisa diliat bahwa nilai var tergantung pada assignmentnya.. ganteng (string) dan jelek (integer).
var harus diassign dari awal dan akan terjadi compile error jika terdapat casting yang mustahil.
Selain itu juga untuk mendukung Anonymous Type pada C# 3.0
Contoh:
- var sesuatu = new { NIM = 1000778899 ; Nama = "Katsuki" };
2. dynamic
Nah pada dynamic, tidak akan terjadi compile error karena akan dijalankan pada saat runtime (sama seperti Ruby dan Phyton sebagai Dynamic Programming). Dengan kata lain, baru diketahui errornya pada saat runtime, bukan pada saat compile program.
Hmm.. hal ini sungguh berbahaya namun memiliki kelebihan jika digunakan tepat pada sasaran.. Apa itu contohnya? Well, sampai saat ini, gw sendiri belum pernah dapet case untuk menggunakan dynamic keyword.
(Maklum jam terbang masih rendah...)
Mao tau lebih banyak? Gunakan Search Engine favorit'mu. hehehe
Maaf kalo ada salah, cuman mao sharing yang saya tau :p
Subscribe to:
Posts (Atom)