Galian Telkom

Hmm.... ^_^

Saturday, June 24, 2006

Judi :)

Orang-orang yang berpendapat bahwa investasi saham bukanlah judi umumnya memberikan argumen bahwa semua hasil pekerjaan mereka itu merupakan hasil analisa yang dalam. Ada itung-itungannya sehingga mereka memutuskan untuk membeli atau menjual saham. Misalnya jika pola-nya seperti ini, oh berarti setelah ini harga jualnya akan turun. Namun mereka tidak bisa mengelak jika dibilang bahwa investasi saham sangatlah berbau spekulasi. Sedalam apapun analisa yang dilakukan, tak seorangpun yang bisa memperkirakan dengan pasti apakah presiden direktur perusahaan A terkena serangan jantung ketika sedang main golf sehingga harga sahamnya anjlok.

Bagaimana dengan judi taruhan bola?

Saya yakin sebagian besar orang akan setuju bahwa taruhan bola adalah judi. Case closed. Namun beberapa hari lalu saya sempat termenung ketika membaca artikel di koran bahwa ada orang yang berpendapat bahwa taruhan bola yang dia lakukan bukanlah termasuk judi. Argumentasinya adalah karena taruhan bola juga membutuhkan analisa yang mendalam sebelum mengambil keputusan. Analisa yang dilakukan meliputi keadaan pemain, keadaan suporter, cuaca, sejarah tim bahkan sampai keadaan rumput stadion. Bahkan kalau perlu juga menggunakan program pemodelan untuk membantu analisa. Kalau sudah begini, apa bedanya dengan investasi saham? Sama-sama menggunakan analisa yang mendalam, sama-sama berbau spekulatif. Nah, jadi kesimpulannya adalah : taruhan bola bukanlah judi jika menggunakan analisa yang mendalam. Namun jika hanya asal tebak, maka itu adalah judi.

Saya tersenyum. Entah kenapa tiba-tiba saya teringat celetukan rekan kuliah saya : "Apaan sih syariah-syariah? Sekalian aja semuanya dikasih label syariah. Ntar gw bikin babi syariah deh!!". Hmmm... taruhan bola syariah? Naah, sepertinya itu bukan ide yang bagus :).

Wednesday, June 14, 2006

Interface di JAVA

Kenapa ada polymorphisme?

Misalkan ada kasus begini : ada sebuah Peternakan mempunyai banyak hewan ternak, katakanlah Sapi, Kambing, Domba dan Babi. Setiap hari, Peternakan harus memberi makan rumput kepada semua hewan yang ada. Bagaimana solusinya? Solusi pertama simpel aja : kita bikin array Sapi, array Kambing, array Domba dan array Babi, kemudian kita panggil method makan() dari seluruh elemennya. Otomatis kita perlu 4 buah loop dong, masing2 untuk tiap array. betul kan? Kelemahan dari solusi ini adalah, bagaimana kalo kita ingin menambah jenis hewannya, katakanlah Onta. Buat array baru, tambah satu loop lagi untuk memanggil elemen2 dari array Onta. Padahal, kalau kita perhatikan lebih mendalam, sebenarnya Peternakan tidak perlu tahu persis, apa jenis dari hewan yang dia kasih makan. Yang penting, dia harus bisa memanggil method makan() dari tiap elemen array. Ya nggak? Oleh karena itu, ada solusi kedua : Kita buat super class HewanTernak yang mempunyai method makan(), kemudian class2 yang lain mengextend class HewanTernak dan mengoverride method makan(). Dengan cara ini, Peternakan hanya perlu menyimpan sebuah array HewanTernak dan hanya perlu satu loop. Isi dari array HewanTernak itu bisa berupa Sapi, Kambing, atau apapun juga yang penting turunan class HewanTernak. Jika ada hewan jenis baru, tinggal ubah isi arraynya. Lebih mudah kan?


Kenapa ada abstract method?

Perhatikan kasus diatas. Muncul pertanyaan : apa isi method makan() dari class HewanTernak? Bagaimana cara makan HewanTernak? Hmmm tergantung seperti apa hewannya kan? Isi dari method makan() pada class HewanTernak menjadi tidak penting karena toh pada akhirnya dioverride oleh Sub Class-nya. Tapi method makan() ini harus ada di class HewanTernak, kalau nggak solusi diatas tidak bisa berjalan. Hmmm ... bagaimana kalau method yang tidak melakukan apa2? hmmm sepertinya itu bukan ide yang bagus karena itu berarti sebuah HewanTernak mempunyai method makan(), namun isinya tidak melakukan apa2. Logikanya agak2 gak masuk kan? Bagaimana juga kalau ada class yang mengextend HewanTernak, tapi tidak mengoverride method makan ? Oleh karena itu ada pendekatan yang disebut abstract method. Dengan adanya abstract method ini, method makan() di class HewanTernak kita jadikan abstract sehingga tidak ada definisi implementasinya, dan kita "memaksa" bagi class-class yang mengextend class HewanTernak harus mendefinisikan method makan(). Dengan adanya abstract method juga, kita bisa melarang orang untuk membuat object yang murni bertipe HewanTernak, namun harus bertipe salah satu sub class dari HewanTernak (entah itu Sapi, Kambing, dll).

Dengan demikian logikanya menjadi begini : class HewanTernak mempunyai method makan(), namun dia sendiri tidak mengetahui implementasi dari method itu karena subclassnya yang tahu. Dengan demikian, HewanTernak memaksa sub-class2nya untuk mengoverride method makan(). Peternakan-pun yakin bahwa seluruh HewanTernak yang dia punya pasti mempunyai method makan ( mau makannya seperti apa, itu bukan urusan Peternakan ).



Kenapa ada interface?

Ini terkait erat dengan kebijakan java yang menghilangkan multiple inheritance. Problem yang umum pada multiple inheritance adalah method yang "berantem". Misalkan pada kasus diatas, tiba2 muncul spesies jenis baru yang merupakan hasil perkawinan antara Sapi dan Babi, sebut aja... Bapi (halah). Problem muncul ketika kita memanggil method makan dari class Bapi. Method mana yang dipanggil? Methodnya Sapi atau methodnya Babi? Nah, dengan alasan inilah java menghilangkan multiple inheritance. Sebagai gantinya, java menyodorkan bentuk yang disebut interface. Karena seluruh method dalam interface pasti tidak ada implementasinya (abstract), maka kita aman untuk mengimplements lebih dari satu interface karena tidak mungkin terjadi method yang "berantem". Kalaupun ada interface yang mempunyai method yang bernama sama, tidak jadi masalah karena semua method di interface pasti abstract alias tidak ada implementasinya.



Kapan kita menggunakan abstract class dan kapan kita menggunakan interface?

Rule of thumbnya begini : Jika ada abstract class yang tidak mempunyai attribute dan seluruh methodnya abstract, lebih baik dijadikan interface saja. Alasannya adalah, jika dijadikan abstract class, maka class2 yang mengextend dia tidak bisa mengextend class yang lain. Sementara jika dijadikan interface, maka class2 yang mengimplements dia masih bisa mengextend class yang lain.