Rabu, 06 Januari 2010

KONSEP PENDIDIKAN DALAM KITAB "TA'LIM MUTA'ALIM" DAN RELEVANSINYA DENGAN DUNIA PENDIDIKAN DEWASA INI

Oleh: KH. M. Kholil Bisri

 

Tamhid

 "Ta'limul Muta'alim" adalah kitab kecil –biasanya saya khatamkan dalam enam atau tujuh hari saja di bulan Romadlon, dengan tempo baca sekitar satu jam setiap hari– hasil rangkuman Syaikh Az-Zarnuji, yang belum mengenal tradisi pesantren, tentu melontar kritik tajam terhadapnya. Dianggapnya kitab yang penuh kontroversi, berisi teror sadis kepada pencari ilmu, tidak masuk akal pembangkit kultus dan sebagainya, bukan lainnya "Ta'limul Muta'alim" itu tapi kitab itu masih saja terus dibaca di pesantren salaf manapun.

Sebelum saja beranjak menguak sedikit isi, seluk beluk dan relevansi kitab TMT, saya ingin menguak dahulu sebuah rahasia yang biasanya hanya disimpan saja di hati para kiyai. Yang rahasia itu hakikatnya adalah inti sari dari kitab TMT tersebut. Begini:

Keberhasilan seseorang mendapat anugerah ilmu nafi’' dan muntafa' bih adalah karena melibatkan tiga faktor yang sangat dominan, yaitu: Pertama, Fadhol dari Allah, karena memang diajar oleh-Nya (alladzi 'allama bil qolam. 'Allamal insaana maa lam ya'lam). Untuk memperoleh fadhol ini, orang harus berdo'a atau dido'akan. Do'a itu harus sungguh-sungguh dan disertai kesungguhan. Tidak boleh dipanjatkan dengan seenaknya dan mengesankan tidak begitu membutuhkan wushulnya do'a, dengan cara misalnya, disamping berdo'a orang juga berbuat maksiat, sama sekali tidak berusaha menghindar dari keharaman yang dilarang. Fa anna yustajaabuu lah. Kedua, Belajar sungguh-sungguh, rajin mengaji dan mengkaji, tekun mengulang dan muthola'ah. Sebuah maqolah yang sering disebut hadits menegaskan "Man tholaba syaian wajadda wajada wa man qoroal baba wa lajja walaja". Siapa saja yang mencari sesuatu dan sungguh-sungguh, dia akan mendapatkannya. Dan barang siapa mengetuk pintu dan dia mengamping, maka dia masuk ke dalam (rumah). Secara implisit firman Allah yang biasanya untuk mendalili orang muslim yang tidak perlu ragu terjun dalam perjuangan: "Walladzina jaahaduu fiinaa lanahdiyannahum subulanaa", mengisyaratkan hal yang demikian itu. Ketiga, Menyadong pertularan (atau apa namanya) dari guru kalau mengacu sebuah pameo "atthob'u saroq" tabiat, watak, karakter itu mencuri, maka kedekatan seseorang dengan orang lain mengakibatkan penularan yang niscaya mengacu sunnah Allah, dia yang lemah akan tertulari yang lebih kuat. Murid akan tertulari dari sang guru.

 Pada kenyataannya, seberapa besar nafi' dan muntafa' bihnya ilmu yang diperoleh oleh tholib tergantung pada seberapa besar kadar ketiga faktor itu diupayakan, diayahi dan menghasilkan. Ada satu faktor lagi yang oleh TMT diisyaratkan pula sebagai salah satu sebab seseorang berhasil mendapatkan ilmu dan yang belakangan ini dilakukan oleh orang tua tholib. Bagi orang tua tholib yang menyikapi secara santun kepada ahli ilmi, kepada siapa tholib "ngangsu ilmu", anaknya atau cucunya niscaya akan menjadi orang alim. Memang tidak ada dalil yang mengukuhkan analisis tersebut. Namun secara empiris bapak saya (almaghfurlah KH. Bisri Musthofa) merasakan itu. Ilmu yang dimaksud adalah ilmu Allah yang memperolehnya dianjurkan (untuk tidak mengatakan diharuskan) melalui sanad (sandaran) yang jelas. Baik sya fawiyyan maupun ijaziyyan. Supaya manfa'at ilmu itu secara ritualistik mendapatkan legalisasinya. Karena manfa'at adalah asas yang mendasari kesungguhan tholibil 'ilmi.

Tholabu ilmillah, mencari ilmu Allah jelas wajib hukumnya. Mencari ilmu al-hal wajib (fardhu) 'ain dan selebihnya wajib (fardhu) kifayah. Dengan demikian mencari ilmu, tholabul ilmi adalah amal ibadah. Dari pendirian keibadahan tholabil ilmi inilah saya mendekati kitab "Ta'limul Muta'alim".

 

Sistimatika Ta'limul Muta'alim

Kitab kecil yang terdiri dari tiga belas fasal itu, separonya bersifat umum, membicarakan bagaimana seharusnya orang sebagai makhluk hidup mengarungi kehidupan.

Seperti lazimnya kitab kecil yang berbobot keilmuan, fasal awal mencoba memberi batasan terhadap apa saja yang berkaitan dengan isi kitab.

Tentang ilmu, keutaman-keutamaannya, bagian-bagiannya dan cara yang seharusnya untu menghasilkan ilmu itu. Karena mencari ilmu itu ibadah, niat tholabul ilmi yang faridhotun itu tidak boleh ditinggalkan. Tentu saja yang dilakukan tholib agar mendapatkan pahala disamping dimaksudkan pula untuk memicu dan memacu semangat pencarian, menangkal pembiasaan, menjaga koinsistensi, menuntun keberhasilan dan tujuan ritualistik yang lain. Dari sinilah seharusnya kandungan kitab TMT didekati sehingga tuduhan kurang menyenangkan atas TMT dihindari. Melakukan niat tholabil ilmi ini diurai pada fasal dua, anniyah fi haalit ta'allumi.

Pada fasal ketiga dikemukakan perlunya selektif dalam memilih ilmu, guru dan teman bermusyawarah sebelum terjun kedalam kancah ta'allum. Pada fasal ini muncul keharusan menjaga terus minat ta'allum, konsistensi dan tabah dalam tekun terhadap ilmu yang dipelajari dan dialami. Karena memang ilmu yang dipelajari, guru yang mengajar,dan teman yang bersamanya mandalami ilmu itu, dipilihnya sendiri secara selektif itu tadi.

Fasal berikutnya yang membuat pakar ilmu masa kini seolah-olah kebakaran jenggot, adalah tentang kewajiban ta'dhim terhadap ilmu itu sendiri dan ahli ilmu.

Fasal keenam adalah tentang bagaimana seharusnya mencari ilmu berbuat. Dia harus sungguh-sungguh dan disiplin. Kesungguhannya itu menopang diatas cita-cita yang luhur.

Memulai (starting) terjun, memperkirakan kemampuan dan tertib belajar sesuai dengan kondisi diri dan ihwal ilmu yang diterjuni adalah bahasan fasal ketujuh.

Tawakkal, kapan seyogyanya tholibul ilmi, berusaha menghasilkan, ramah dan setia terhadap cita-cita, tidak melewatkan waktunya dan istifadah (membuat catatan-catatan baik dalam tulisan maupun benak), waro' (menjaga makanan dan perbuatan yang dilarang untuk tidak disantap atau dilakukan), apa saja yang membuat orang mudah menghafal dan yang mudah membuat orang gampang lupa dan yang terakhir adalah tentang amalan dan bacaan yang membuat pelakunya tercurahi rizqi Allah. Itu semua adalah pasal kedelapan sampai ketigabelas.

Asas manfaat yang mendasari keibadahan tholabil 'ilmi sebagai pendekatan. Pada awal coret-coret ini, saya mengemukakan bahwa ilmu nafi' yang muntafa' bih adalah anugerah dari Allah yang "allamal insaana maa lam ya' lam". Manfaat dan guna yang didapat oleh orang yang memperoleh keuntungan dari ilmu itu, tidak hanya didunia ini saja, namun juga akhiratnya. Karena itu untuk menghasilkan ilmu yang bermanfaat, tidak hanya menghajatkan peranan dari pencari ilmu itu sendiri. Peranan Allah dan peranan perantara guru dimana orang berhasil mandapatkan ilmu, sama sekali tidak bisa dipisahkan. Hal-hal (baca: a'mal) yang melibatkan Allah SWT. Demi perkenan-Nya, ridho-Nya, kita menyebutnya ibadah.

Ibadah sebagaimana amal-amal lain, ada permulaannya, prosesnya dan akhirnya. Masing-masing menghajatkan pada pemenuhan aturan main yang telah ditetapkan agar yang dilakukannya tidak sia-sia dan sah adanya. Apalagi amal ibadah yang bernama tholabil ilmi menempati peringkat diatas qiyamil lail dan puasa sunnah, mengapa? Ya, karena ilmu itulah yang mengantar orang terhormat dan mulia disisi Allah oleh karena ketakwaan, "Inna akromakum 'indallohi atqaakum". Ilmu adalah wasilah untuk takwa dan takwa adalah wasilah mulia 'indallah. Yang mulia 'indalloh tentu mulia 'nda siwahu min kholqihi.

Ilmu yang menjadi washilah kepada takwa itulah yang dapat disebut sebagai ilmu nafi' wa muntafa' bih (ilmu yang bermanfaat).

Berangkat dari sini, kiranya tidak berlebihan manakala kita pertama-tama harus mampu menempatkan kedudukan ilmu sedemikian rupa, sehingga ghoyatun nafi' dan intifa' dapat dicapai oleh tholib. Dan pada tempatnya pula dia bersikap ta'dhim terhadap apa dan siapa yang diharapkannya akan memberi manfaat yang sebesar-besarnya kepada dirinya, dunia dan akhirat. Kendatipun dia secara filsofis terpaksa menentukan klasifikasi ta'd'him itu. Tergantung pada siapa dia harus berlaku ta'dhim.

Memang pada dasarnya sifat batin adalah sifat bathini, karenanya tidak transparan. Tampilannya bisa beberapa bentuk sesuai dangan keadaan. Keadaan mu'adhdhim dan mu'adhdhom itu sendiri, latar belakang keduanya dan seterusnya.

 

At-Ta'dhim

Tampilan ta'dhim yang beraneka bentuk itu tentu saja tidak boleh keluar dari batas —layak— wajar. Karena memang ta'dhim bagi tholib adalah kewajaran, sesuatu yang layak dilakukan terhadap yang ia merasa harus menta'dhimkannya. Dan merupakan garapan tholibul ilmi untuk mengartikulasikannya dalam ia memilih tampilan ta'dhim, dilakukannya dengan kesungguhan dan sepenuh hati. Tidak kemudian terperangkap kedalam bentuk yang sering kita dengar dengan sebutan mudahanah atau mujahalah belaka. Lamis dan menjilat, semu dan tak bermakna.

Untuk itu tholib harus pandai dan cermat menentukan pilihan ilmu apa yang paling baik yang harus dia cari. Sesuai dengan minat dan bakatnya. Bahkan ketika bergurupn dia tidak dibenarkan sembarangan dan asal-asalan. Pilihan ang ditentukan sendiri akan lebih mendorongnya kepada kesungguhan ta'dhim. Oleh TMT kesungguhan ta'dhimil ilmi dirupakan dengan tidak menjamah kitab yang berisi kandungan ilmu itu, kecuali dalam keadaan suci dari hadats. Sebelum dia muthola'ah, mengaji atau mengulang pelajaran, berwudhu lebih dahulu. Sebab ilmu itu nur dan wudhu mewujudkan nur pada diri. Tidak menaruh kitab sejajar, apalagi di bawah bokong. Dan seterusnya. Sedang ilmu yang sebaiknya dipilih oleh tholib secara klasifikasial adalah yang dia hajatkan mendesak bagi urusan agamanya, yang dibutuhkan untuk menuntun kebahagiaan masa depan (bahkan depan sekali yaitu ketika kelak harus menghadap kholiqnya) dan dihajatkan bagi mengatur hidupnya dunia akhirat.

Dalam hal tholib memilih guru, kalau ada, pilih yang mengumpulkan kealiman yang kealimannya dimasyhurkan sebagai handal (al a'lam) yang secara khuluqi, mengatur kehidupan keseharian sedemikian rupa sehingga tidak terkena imbas aib sosial, menjauhi kedurhakaan dan maksiat serta menjaga muru'ah (al-auro’) dan yang memiliki nilai lebih dalam kematangan ilmu dan amalnya serta lebih tua usianya daripada ulama (kiyai) lain (al-asann). Hal ini barangkali dimaksudkan agar tertancap pada diri tholib kemantapan berguru. Dengan demikian tanpa ragu-ragu lagi, tholib bersikap ta'dhim kental kepada gurunya itu. Oleh TMT, dicontohkan dengan tidak ngomong kalau tidak didangu tidak bergeser tempat duduk sebelum sang guru beranjak dari tempatnya, tidak terlalu dekat dan tidak pula terlalu jauh dari guru, ketika didangu tidak berulah yang menyebabkan guru terganggu. Mematuhi segala perintahnya apapun bentuknya. Dan seterusnya. Ta'dhim ini berlanjut kepada keluarga sang guru. Pendek kata tidak membuat guru tertekan (diantara tanda kutip) secara moral ta'dhim kepada guru ini, dilakukan oleh tholib untuk mendapat perkenannya. Bukankah gurupun harus memberi dengan sifat kasih dan sepenuh hati pula? Bukankah pemberin itu wasilah untuk mendapatkan dan menghantarkannya kepada "raf'ad darojat"?

Oleh TMT guru disamakan dengan dokter (thobib). Kalau dia tidak dihormati, dia tidak akan memberi yang terbaik yang sangat dibutuhkan murid atau pasien itu, meskipun dia (pura-pura) memeriksanya dan menuliskan resep. Melengkapi hujjah TMT adalah sebuah ungkapan, yaitu: “Maa washola man washola illa bilhurmati wat ta'dhim, wa maa saqotho man saqotho illa bitarkilhurmati wat ta'dhim”.

Melakukan pilihan sendiri secara cermat terhadap ilmu dan guru dimaksudkan agar tholib tidak meninggalkan ilmu dan gurunya itu, sebelum dia dinyatakan selesai dalam berguru. Sebab meninggalkan ilmu dan guru sebelum saat dinyatakan selesai adalah desersi dan itu sangat menyakitkan. Dengan demikian sulit ilmu yang sudah dia kuasai bermanfaat. Memilih rekan adalah suatu yang tidak boleh di abaikan oleh tholib. Rekan itu harus serasi, yang mau dan mampu diajak rembugan, musyawarah, berakhlak terpuji. Pendek kata dia harus serekan yang kebaikaannya bisa kamu curi. Sebab "at thob'u saroqo", tabiat itu pasti mencuri, punya dampak dan sangat mempengaruhi perilaku dan penilaian.

 

Layaqoh Ma'hudah

Untuk menyikapi ilmu, guru dan rekan yang seperti tersebut diatas, untuk menganggap sikap ta'dhim ala TMT berlebihan atau tidak, untuk mengatakan sikap-sikap TMT relevan atau tidak kaitannya dengan sistem pendidikan dewasa ini tergantung dimana sebenarnya seseorang (sebagai tholib) menempatkan dirinya dalam kedudukan dan peranan apa, menurut anggapan tholib, guru berpengaruh pada "pembentukan diri". Seberapa besar guru memberi manfaat pada kehidupan tholib. Sampai sejauh mana jangkauan tholib mengapa dia melengkapi diri dengan ilmu itu.

 Barangkali bisa saya katakan bahwa substansi pendidikan (yang bahasa kitabnya at-tarbiyah dari "madhi" robba yang maknanya " memberangkatkan pagi-pagi" atau "memperkembangkan sejak mula", sejak ditanam bagi tanaman dan sejak masa pertumbuhan bagi anak manusia) adalah menggarap jiwa anak manusia menurut fitrahnya adalalah bersih-bersih bagaikan kertas putih dia bisa ditulisi, dilukis, dicoret-coret atau diapakan saja bahkan disobek-sobek. Ditarbiyah dengan demikian bisa diusulkan untuk berarti: “tughda wa tunsau kama hiya makhluqotun bihi bighoiri taghyiri wa thawili majraha, dibiarkan berangkat dan beranjak tumbuh sesuai dengan fitrahnya tanpa harus dibiasakan dari alur yang semestinya dengan menuntun dan memberi contoh yang diinginkan serta memberi warna yang seindah-indahnya sesuai dengan kemampuan yang dimiliki oleh dia yng dididik. Sehingga tertanam pada dirinya haiah rosikhoh tashduru min halil af 'aal.

 Sasaran pendidikan dengan demikian adalah jiwa. Jiwa lebih peka terhdap rasa yang

 jelas tidak nyata. Kebesaran jiwa tidak nyemumuk seperti halnya kecahayaan ini tidak membinar. Namun kebesaran dan kecahayaan itu dapat dirasakan. Membentuk kebesaran dan kecahayaan itu bisa efektif bila dengan perangkat kedekatan rasa pula. Kedekatan rasa yang dijalin antara guru dan tholib dengan tali Allah dan tali rohmah ini akan menjalin keberhasilan amal tarbiyah. Tarbiyah yang diarahkan kepada ketaqwaan. Wallahu 'alam.

Kita mengerti sepenuh bahwa: menggarap sesuatu itu tergantung kepada apa yang digarap. Sepanjang yang digarap tidak berubah, pola dan format garapan tidak perlu dirubah kefitrahan manusia. Pada dasarnya tidak pernah dirubah, karena itu relevansi konsep yang telah disepakati sebagai ideal, efektif dan menjanjikan bagi menggarap jiwa manusia, belum layak dipersoalkan. Kalaupun dalam kenyataannya terjadi perubahan profil, kemencegan tampilan dan fariasi lagak gaya akibat pengaruh makanan dan lingkungan, tinggal menyesuaikan cara penanganan saja.

 

At- Talkhis Al Mudawwan

  1. Mencari Ilmu harus dengan niat menghilangkan kebodohan untuk selanjutnya menggapai ridha Allah.
  2. 2.  Mencari dengan terjun kelubuk pendidikan, berarti mencurahkan segala yang ada pada diri untuk       mendapatkan manfaat yang sebesar-besarnya.
  3. Ilmu yang kelak diperoleh harus mejadi wasilah menuju kepada takwa, yang tentu akan mengangkat derajat mulia disisi Allah.
  4. Ilmu adalah cahaya, anugerah dan karunia Allah, yang untuk mencapainya antara lain lewat perantaraan guru. Kalaupun tanpa guru yaitu dengan membaca, menurut konsep Al-Qur'an harus dengan atas nama Allah.
  5. Ilmu yang membuat orang mulia dan terhormat, dan mencurahkan manfaat yang sebesar-besarnya itu, sangat pada tempatnya untuk dita'dhimkan. Adalah terjemahan dari rasa terima kasih yang besar dan penghargaan yang mendalam.
  6. Menta'dhimkan guru sebagai rasa terima kasih yang nota bene ahlul ilmi itu adalah pada tempatnya, sangaat layak dan terpuji. Dan adalah berarti menta'dhimkan ilmu itu sendiri.
  7. Menta'dhimkan harus berarti pula tidak membuat yang bersangkutan merasa tertekan dari arah manapun, langsung atau tidak langsung.
  8. Ta'dhim bukanlah ta'abbud. Namun bisa saja laku ta'dhim karena menjalankan perintah syari'. Menjalankan perintahnya berarti juga ta'abbud.
  9. Mencari ilmu dengan konsep TMT membuat tholib sadar posisi dan ikhlas.

 

At-Talkhis Al-Mu'abbar

Barangkali oleh karena Az-Zarnuji melihat kependidikan itu dengan kaca mata keteladanan, meskipun secara emphiris dapat dibuktikan, maka yang tertuang terkesan berlebihan. Andaikata saya tidak khawatir disebut sebagai su’ul adab, saya akan mengatakan bahwa TMT adalah kerangka acuan hasil temuan atau rangkuman pengalaman ahlil ilmi dan belum disusus seperti layaknya konsep.

Namun secara kualitatif memiliki bobot yang efektif sebagai pedoman untuk menciptakan dunia pendidikan yang ideal yang masih sangat mungkin diterapkan kapan saja. Oleh karena itu, saya memberanikan diri untuk menganggap isi kitab TMT masih sangat relevan untuk diterapkan pada dunia pendidikan dewasa ini, sepanjang format belum berubah.

Tentang hubungan pendidik anak didik, guru murid, kiyai santri, pemberi manfaat penerima manfaat, dan seterusnya, adalah wajar dan memenuhi tuntunan ajaran serta tuntunan keorangan apabila terjalin tali keeratan yang terbuhul atas dasar filosofi sadar posisi bagi masing-masing. Dan itu harus dipertahankan kelanggegnannya agar pengawasan batini dapat dilakukan terus menerus.

Kelanggengan hubungan antar dua kutub tersebut hanya dapat dicapai dengan keikhlasan yang putih.

 

Takhtim

Alur yang dipilih Az-Zarnuji untuk mengalirkan gagasan beliau, saya kira sudah memenuhi aspek muthobaqoh tadhomun maupun iltizam. Dan itulah hasil pendilalahan yang benar dari lafal: at-tarbiyah.

 Pada kurun masa segala aspek tata kehidupan sudah bergeser seperati sekarang ini dan menjelang berlakunya era indrustrialisasi, saya kira konsep yang ada pada kandungan TMT, sebaiknya didukung untuk disosialisasikan dan dikembangkan secara adapatatif. Dengan melibatkan para pakar disiplin ilmu tertentu dan penambahan tata nilai. Sebab dapat saja saya mengatakan: untuk membentuk generasi penerus yang terdidik lagi bertakwa kepada Allah SWT. Belum ada pedoman khususnya selain kitab TA'LIMUL MUTA'ALIM.

 

Rembang, Shofarul Khoir 1414 H.

Dikutip dari Makalah yang beliau sampaikan di Pondok Pesantren Al-Hamidiyyah Jakarta.

Blogged with the Flock Browser

Selasa, 05 Januari 2010

Algoritma Sorting

BAB 6
Algoritma Sorting
6.1 Tujuan
Sorting adalah proses menyusun elemen – elemen dengan tata urut tertentu dan
proses tersebut terimplementasi dalam bermacam aplikasi. Kita ambil contoh pada
aplikasi perbankan. Aplikasi tersebut mampu menampilkan daftar account yang aktif.
Hampir seluruh pengguna pada sistem akan memilih tampilan daftar berurutan
secara ascending demi kenyamanan dalam penelusuran data.
Beberapa macam algoritma sorting telah dibuat karena proses tersebut sangat
mendasar dan sering digunakan. Oleh karena itu, pemahaman atas algoritma –
algoritma yang ada sangatlah berguna.
Pada akhir pembahasan, diharapkan pembaca dapat :
1. Memahami dan menjelaskan algoritma dari insertion sort, selection sort,
merge sort dan quick sort.
2. Membuat implementasi pribadi menggunakan algoritma yang ada
6.2 Insertion Sort
Salah satu algoritma sorting yang paling sederhana adalah insertion sort. Ide dari
algoritma ini dapat dianalogikan seperti mengurutkan kartu. Penjelasan berikut ini
menerangkan bagaimana algoritma insertion sort bekerja dalam pengurutan kartu.
Anggaplah anda ingin mengurutkan satu set kartu dari kartu yang bernilai paling
kecil hingga yang paling besar. Seluruh kartu diletakkan pada meja, sebutlah meja
ini sebagai meja pertama, disusun dari kiri ke kanan dan atas ke bawah. Kemudian
kita mempunyai meja yang lain, meja kedua, dimana kartu yang diurutkan akan
diletakkan. Ambil kartu pertama yang terletak pada pojok kiri atas meja pertama
dan letakkan pada meja kedua. Ambil kartu kedua dari meja pertama, bandingkan
dengan kartu yang berada pada meja kedua, kemudian letakkan pada urutan yang
sesuai setelah perbandingan. Proses tersebut akan berlangsung hingga seluruh kartu
pada meja pertama telah diletakkan berurutan pada meja kedua.
Algoritma insertion sort pada dasarnya memilah data yang akan diurutkan menjadi
dua bagian, yang belum diurutkan (meja pertama) dan yang sudah diurutkan (meja
kedua). Elemen pertama diambil dari bagian array yang belum diurutkan dan
kemudian diletakkan sesuai posisinya pada bagian lain dari array yang telah
diurutkan. Langkah ini dilakukan secara berulang hingga tidak ada lagi elemen yang
tersisa pada bagian array yang belum diurutkan.
J.E.N.I.
Pengenalan Pemrograman 2 2
6.2.1 Algoritma
void insertionSort(Object array[], int startIdx, int endIdx) {
for (int i = startIdx; i < endIdx; i++) {
int k = i;
for (int j = i + 1; j < endIdx; j++) {
if (((Comparable) array[k]).compareTo(array[j])>0) {
k = j;
}
}
swap(array[i],array[k]);
}
}
6.2.2 Sebuah Contoh
Data 1st Pass 2nd Pass 3rd Pass 4th Pass
Mango Mango Apple Apple Apple
Apple Apple Mango Mango Banana
Peach Peach Peach Orange Mango
Orange Orange Orange Peach Orange
Banana
Banana
Banana
Banana
Peach
Gambar 1.1.2: Contoh insertion sort
Pada akhir modul ini, anda akan diminta untuk membuat implementasi bermacam
algoritma sorting yang akan dibahas pada bagian ini.
6.3 Selection Sort
Jika Anda diminta untuk membuat algoritma sorting tersendiri, anda mungkin akan
menemukan sebuah algoritma yang mirip dengan selection sort. Layaknya insertion
sort, algoritma ini sangat rapat dan mudah untuk diimplementasikan.
Mari kita kembali menelusuri bagaimana algoritma ini berfungsi terhadap satu paket
kartu. Asumsikan bahwa kartu tersebut akan diurutkan secara ascending. Pada
awalnya, kartu tersebut akan disusun secara linier pada sebuah meja dari kiri ke
kanan, dan dari atas ke bawah. Pilih nilai kartu yang paling rendah, kemudian
tukarkan posisi kartu ini dengan kartu yang terletak pada pojok kiri atas meja. Lalu
cari kartu dengan nilai paling rendah diantara sisa kartu yang tersedia. Tukarkan
kartu yang baru saja terpilih dengan kartu pada posisi kedua. Ulangi langkah –
langkah tersebut hingga posisi kedua sebelum posisi terakhir dibandingkan dan
dapat digeser dengan kartu yang bernilai lebih rendah.
J.E.N.I.
Pengenalan Pemrograman 2 3
Ide utama dari algoritma selection sort adalah memilih elemen dengan nilai paling
rendah dan menukar elemen yang terpilih dengan elemen ke-i. Nilai dari i dimulai
dari 1 ke n, dimana n adalah jumlah total elemen dikurangi 1.
6.3.1 Algoritma
void selectionSort(Object array[], int startIdx, int endIdx) {
int min;
for (int i = startIdx; i < endIdx; i++) {
min = i;
for (int j = i + 1; j < endIdx; j++) {
if (((Comparable)array[min]).compareTo(array[j])>0) {
min = j;
}
}
swap(array[min], array[i]);
}
}
6.3.2 Sebuah Contoh
Data 1st Pass 2nd Pass 3rd Pass 4th Pass
Maricar Hannah Hannah Hannah Hannah
Vanessa Vanessa Margaux Margaux Margaux
Margaux Margaux Vanessa Maricar Maricar
Hannah Maricar Maricar Vanessa Rowena
Rowena
Rowena
Rowena
Rowena
Vanessa
Figure 1.2.2: Contoh selection sort
6.4 Merge Sort
Sebelum mendalami algoritma merge sort, mari kita mengetahui garis besar dari
konsep divide and conquer karena merge sort mengadaptasi pola tersebut.
6.4.1 Pola Divide and Conquer
Beberapa algoritma mengimplementasikan konsep rekursif untuk menyelesaikan
permasalahan. Permasalahan utama kemudian dipecah menjadi sub-masalah,
J.E.N.I.
Pengenalan Pemrograman 2 4
kemudian solusi dari sub-masalah akan membimbing menuju solusi permasalahan
utama.
Pada setiap tingkatan rekursi, pola tersebut terdiri atas 3 langkah.
1. Divide
Memilah masalah menjadi sub masalah
2. Conquer
Selesaikan sub masalah tersebut secara rekursif. Jika sub-masalah tersebut
cukup ringkas dan sederhana, pendekatan penyelesaian secara langsung akan
lebih efektif
3. Kombinasi
Mengkombinasikan solusi dari sub-masalah, yang akan membimbing menuju
penyelesaian atas permasalahan utama
6.4.2 Memahami Merge Sort
Seperti yang telah dijelaskan sebelumnya, Merge sort menggunakan pola divide and
conquer. Dengan hal ini deskripsi dari algoritma dirumuskan dalam 3 langkah
berpola divide-and-conquer. Berikut langkah kerja dari Merge sort:
1. Divide
Memilah elemen – elemen dari rangkaian data menjadi dua bagian.
2. Conquer
Conquer setiap bagian dengan memanggil prosedur merge sort secara
rekursif
3. Kombinasi
Mengkombinasikan dua bagian tersebut secara rekursif untuk mendapatkan
rangkaian data berurutan
Proses rekursi berhenti jika mencapai elemen dasar. Hal ini terjadi bilamana bagian
yang akan diurutkan menyisakan tepat satu elemen. Sisa pengurutan satu elemen
tersebut menandakan bahwa bagian tersebut telah terurut sesuai rangkaian.
6.4.3 Algoritma
void mergeSort(Object array[], int startIdx, int endIdx) {
if (array.length != 1) {
//Membagi rangkaian data, rightArr dan leftArr
mergeSort(leftArr, startIdx, midIdx);
mergeSort(rightArr, midIdx+1, endIdx);
combine(leftArr, rightArr);
}
}
J.E.N.I.
Pengenalan Pemrograman 2 5
6.4.4 Sebuah Contoh
Rangkaian data:
7 2 5 6
Membagi rangkaian menjadi dua bagian:
LeftArr RightArr
7 2 5 6
Membagi LeftArr menjadi dua bagian:
LeftArr RightArr
7 2
Mengkombinasikan
2 7
Membagi RightArr menjadi dua bagian:
LeftArr RightArr
Mengkombinasikan
5 6
Mengkombinasikan LeftArr dan RightArr.
2 5 6 7
Gambar 1.3.4: Contoh merge sort
6.5 Quicksort
Quicksort ditemukan oleh C.A.R Hoare. Seperti pada merge sort, algoritma ini juga
berdasar pada pola divide-and-conquer. Berbeda dengan merge sort, algoritma ini
hanya mengikuti langkah – langkah sebagai berikut :
1. Divide
Memilah rangkaian data menjadi dua sub-rangkaian A[p…q-1] dan A[q+1…r]
dimana setiap elemen A[p…q-1] adalah kurang dari atau sama dengan A[q]
dan setiap elemen pada A[q+1…r] adalah lebih besar atau sama dengan
elemen pada A[q]. A[q] disebut sebagai elemen pivot. Perhitungan pada
elemen q merupakan salah satu bagian dari prosedur pemisahan.
J.E.N.I.
Pengenalan Pemrograman 2 6
2. Conquer
Mengurutkan elemen pada sub-rangkaian secara rekursif
Pada algoritma quicksort, langkah ”kombinasi” tidak di lakukan karena telah terjadi
pengurutan elemen – elemen pada sub-array
6.5.1 Algoritma
v
oid quickSort(Object array[], int leftIdx, int rightIdx) {
int pivotIdx;
/* Kondisi Terminasi */
if (rightIdx > leftIdx) {
pivotIdx = partition(array, leftIdx, rightIdx);
quickSort(array, leftIdx, pivotIdx-1);
quickSort(array, pivotIdx+1, rightIdx);
}
}
6.5.2 Sebuah Contoh
Rangkaian data:
3 1 4 1 5 9 2 6 5 3 5 8
Pilih sebuah elemen yang akan menjadi elemen pivot.
3 1 4 1 5 9 2 6 5 3 5 8
Inisialisasi elemen kiri sebagai elemen kedua dan elemen kanan sebagai elemen
akhir.
kiri kanan
3 1 4 1 5 9 2 6 5 3 5 8
Geser elemen kiri kearah kanan sampai ditemukan nilai yang lebih besar dari elemen
pivot tersebut. Geser elemen kanan ke arah kiri sampai ditemukan nilai dari elemen
yang tidak lebih besar dari elemen tersebut.
kiri kanan
3 1 4 1 5 9 2 6 5 3 5 8
Tukarkan antara elemen kiri dan kanan
kiri kanan
3 1 3 1 5 9 2 6 5 4 5 8
J.E.N.I.
Pengenalan Pemrograman 2 7
Geserkan lagi elemen kiri dan kanan.
kiri kanan
3 1 3 1 5 9 2 6 5 4 5 8
Tukarkan antar elemen kembali.
kiri kanan
3 1 3 1 2 9 5 6 5 4 5 8
Geserkan kembali elemen kiri dan kanan.
kanan kiri
3 1 3 1 2 9 5 6 5 4 5 8
Terlihat bahwa titik kanan dan kiri telah digeser sehingga mendapatkan nilai elemen
kanan < elemen kiri. Dalam hal ini tukarkan elemen pivot dengan elemen kanan.
pivot
2 1 3 1 3 9 5 6 5 4 5 8
Gambar 1.4.2: Contoh quicksort
Kemudian urutkan elemen sub-rangkaian pada setiap sisi dari elemen pivot.
6.6 Latihan
6.6.1 Insertion Sort
Impelementasikan algoritma insertion sort dalam Java untuk mengurutkan
serangkaian data integer. Lakukan percobaan terhadap hasil implementasi anda
terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command
line.
6.6.2 Selection Sort
J.E.N.I.
Pengenalan Pemrograman 2 8
Impelementasikan algoritma selection sort dalam Java untuk mengurutkan
serangkaian data integer. Lakukan percobaan terhadap hasil implementasi anda
terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command
line.
6.6.3 Merge Sort
Gunakan implementasi merge sort berikut ini terhadap serangkaian data integer.
class MergeSort {
static void mergeSort(int array[], int startIdx,
int endIdx) {
if(startIdx == _____) {
return;
}
int length = endIdx-startIdx+1;
int mid = _____;
mergeSort(array, _____, mid);
mergeSort(array, _____, endIdx);
int working[] = new int[length];
for(int i = 0; i < length; i++) {
working[i] = array[startIdx+i];
}
int m1 = 0;
int m2 = mid-startIdx+1;
for(int i = 0; i < length; i++) {
if(m2 <= endIdx-startIdx) {
if(m1 <= mid-startIdx) {
if(working[m1] > working[m2]) {
array[i+startIdx] = working[m2++];
} else {
array[i+startIdx] = _____;
}
} else {
array[i+startIdx] = _____;
}
} else {
array[_____] = working[m1++];
}
}
}
public static void main(String args[]) {
int numArr[] = new int[args.length];
for (int i = 0; i < args.length; i++) {
numArr[i] = Integer.parseInt(args[i]);
}
mergeSort(numArr, 0, numArr.length-1);
for (int i = 0; i < numArr.length; i++) {
System.out.println(numArr[i]);
}
}
}
6.6.4 Quicksort
J.E.N.I.
Pengenalan Pemrograman 2 9
Gunakan implementasi quicksort berikut ini terhadap serangkaian data integer.
class QuickSort {
static void quickSort (int[] array, int startIdx,
int endIdx) {
// startIdx adalah index bawah
// endIdx is index atas
// dari array yang akan diurutkan
int i=startIdx, j=endIdx, h;
//pilih elemen pertama sebagai pivot
int pivot=array[_____];
// memilah
do {
while (array[i]_____pivot) {
i++;
}
while (array[j]>_____) {
j--;
}
if (i<=j) {
h=_____;
array[i]=_____;
array[j]=_____;
i++;
j--;
}
} while (i<=j);
// rekursi
if (startIdx<j) {
quickSort(array, _____, j);
}
if (i<endIdx) {
quickSort(array, _____, endIdx);
}
}
public static void main(String args[]) {
int numArr[] = new int[args.length];
for (int i = 0; i < args.length; i++) {
numArr[i] = Integer.parseInt(args[i]);
}
quickSort(numArr, 0, numArr.length-1);
for (int i = 0; i < numArr.length; i++) {
System.out.println(numArr[i]);
}
}
}

Pengenalan Generics

BAB 13
Pengenalan Generics
13.1 Tujuan
Release Java terbaru menyediakan langkah terbesar dalam pemrograman Java
dibandingkan dengan versi-versi lain sebelumnya. Ini terdiri atas ekstensi yang cukup
signifikan terhadap source language syntax. Bagian yang paling terlihat yaitu
penambahan generic types.
Modul ini mengenalkan Anda konsep dasar mengenai Java generic types.
Pada akhir pembahasan, diharapkan pembaca dapat :
1. Mengapresiasikan keuntungan dari generic types
2. Mendeklarasikan class generic
3. Menggunakan constrained generic
4. Mendeklarasikan method generic
13.2 Mengapa Generic?
Satu dari penyebab adanya bugs yang paling signifikan dalam Bahasa pemrograman
Java adalah keperluan akan pernyataan typecast atau downcast untuk lebih
mengkhususkan tipe data dari tipe staticnya secara terus-menerus. Sebagai contoh,
Sebuah object arraylist memungkinkan kita untuk menambahkan beberapa referensi tipe
object pada list tapi ketika kita mendapatkan kembali elemet ini , kita perlu untuk
typecast object ke tipe referensi khusus yang sesuai dengan keperluan kita. Downcasting
adalah hotspot yang potensial untuk ClassCastException. Yang juga membuat kode kita
menjadi lebih panjang, jadi, menjadi lebih sedikit dapat terbaca. Lebih dari itu,
downcasting juga efektif merusak manfaat dari sebuah kekuatan bahasa yang diketikkan
sejak dia menghapuskan keamanan yang disediakan perusahaan berupa pemeriksaan
tipe(type checking).
Tujuan utama dari penambahan generic pada Java adalah untuk memecahkan masalah
ini. tipe Generic memungkinkan subuah single class untuk bekerja dengan pilihan tipe
yang beraneka ragam. Ini adalah jalan yang alami untuk mengeliminasi keperluan untuk
pemilihan (casting).
Langkah awal mempertimbangkan sebuah object ArrayList dan lihatlah bagaimana type
generic akan membantu dalam peningkatan kode kita. Seperti yang sudah Anda ketahui,
sebuah object arraylist memiliki kemampuan untuk menyimpan elemen-elemen dari
beberapa tipe referensi untuk list ini. Sebuah instance arraylist, bagaimanapun, selalu
memaksa kita untuk men-downcast object-object kita membantu mendapatkan kembali
dari list. Pertimbangkan pernyataan berikut :
S
tring myString = (String) myArrayList.get(0);
Versi generic dari class ArrayList didesain untuk bekerja secara asli dengan beberapa
J.E.N.I.
Pengenalan Pemrograman 2 2
tipe class. Sama seperti, dia juga mempertahankan manfaat dari pengecekan tipe (type
checking). Kita dapat melanjutkannya dengan keperluan memiliki typecast elemen yang
kita dapatkan dari list dan memiliki pernyataan berikut terhadap pernyataan sebelumnya
:
String myString = myArrayList.get(0);
Walaupun downcasting sudah terhapus, ini bukan berarti bahwa Anda dapat menandai
segala sesuatu sebagai return value dari method get dan melanjutkannya dengan
typecasting semuanya. Jika Anda menandai sesuatu yang lain disamping sebuah String
untuk output dari method get, Anda akan menghadapi sebuah waktu mengcompile type
tidak sesuai seperti pesan berikut ini :
f
ound: java.lang.String
required: java.lang.Integer
Integer data = myArrayList.get(0);
Agar hanya memiliki ide bagaimana type-type generic digunakan sebelum materi ini
dibahas lebih dalam, sebaiknya Anda pertimbangkan potongan kode berikut ini :
ArrayList <String> genArrList = new ArrayList <String>();
genArrList.add("A generic string");
String myString = genArrList.get(0);
JoptionPane.showMessageDialog(this, myString);
Amatilah melalui pernyataan, anda mungkin mengamati kata <String> segera terlihat
setelah referensi tipe data arraylist. Anda dapat menerjemahkan pernyataan pertama
sebagai instantiasi sebuah versi generic dari class ArrayList dan versi generic ini terdiri
dari object-object dari tipe String. genArrList adalah batas dari tipe String. Oleh sebab
itu, mengikat sebuah Integer atau beberapa tipe lain bukan String untuk hasil dari get
function akan menjadi illegal. Pernyataan berikut ini adalah illegal.
int myInt = genArrList.get();
13.3 Mendeklarasikan sebuah Class Generic
Untuk menjalankan potongan code sebelumnya, kita harus sudah mendefinisikan versi
generic dari class ArrayList. Untungnya, versi java terbaru sudah menyediakan user
dengan versi generic dari semua class-class Java Collection. Pada sesi ini, Anda akan
mempelajari bagaimana untuk mendeklarasikan class generic anda sendiri.
Dripada berdiskusi lebihpanjang lagi tentang bagaimana untuk mendeklarasikan sebuah
class generic , anda akan diberikan sebuah contoh sederhana tentang class generic
untuk dipelajari bentuknya.
c
lass BasicGeneric <A> {
private A data;
public BasicGeneric(A data) {
this.data = data;
}
public A getData() {
return data;
}
}
J.E.N.I.
Pengenalan Pemrograman 2 3
p
ublic class GenSample {
public String method(String input) {
String data1 = input;
BasicGeneric <String> basicGeneric = new
BasicGeneric <String>(data1);
String data2 = basicGeneric.getData();
return data2;
}
public Integer method(int input) {
Integer data1 = new Integer(input);
BasicGeneric <Integer> basicGeneric = new
BasicGeneric <Integer>(data1);
Integer data2 = basicGeneric.getData();
return data2;
}
public static void main(String args[]) {
GenSample sample = new GenSample();
System.out.println(sample.method("Some generic data"));
System.out.println(sample.method(1234));
}
}
Sekarang mari kita melalui bagian dari kode yang menggunakan syntax untuk type
generic.
Untuk deklarasi dari class BasicGeneric,
c
lass BasicGeneric <A>
nama class diikuti oleh sepasang kurung yang didalamnya terdapat huruf kapital A:
<A>. Ini disebut dengan sebuah parameter tipe. Penggunaan kurung ini
mengindikasikan bahwa class yang dideklarasikan adalah class generic. Ini berarti bahwa
class tidak bekerja dengan beberapa type referensi khusus.
kemudian, amati bahwa sebuah field dari class dideklarasikan menjadi tipe A
private A data;
Deklarasi ini mengelompokkan bahwa field data adalah dari tipe generic, tergantung
pada tipe data yang telah didesain untuk bekerja dengan object BasicGeneric.
Ketika mendeklarasikan sebuah instance dari class, anda harus mengelompokkan tipe
referensi dengan yang mana yang anda inginkan untuk bekerja sama.
BasicGeneric <String> basicGeneric = new
BasicGeneric <String>(data1);
Syntax <String> setelah mendeklarasi BasicGeneric mengelompokkan bahwa instance
dari class ini akan bekerja dengan variabel-variabel bertipe String.
Anda juga dapat bekerja denga variabel-variabel bertipe Integer atau referensi tipe yang
lain. Untuk bekrja dengan Integer, potongan kode memiliki pernyataan berikut ini :
BasicGeneric <Integer> basicGeneric = new
J.E.N.I.
Pengenalan Pemrograman 2 4
BasicGeneric <Integer>(data1);
Anda mungkin dapat menerjemahkan sisa dari kode dengan pemahaman anda sendiri.
Mempertimbangkan deklarasi dari method getData .
public A getData() {
return data;
}
Method getData mengembalikan sebuah nilai dari tipe A, Sebuah Tipe type. Ini bukan
berarti bahwa method tidak akan memiliki tipe data runtime, atau even pada waktu
meng-compile. Setelah Anda mendeklarasikan sebuah object yang bertipe BasicGeneric,
A adalah pengikat ke sebuah tipe data yang spesifik. Instance ini akan berlaku sebagai
jika ini dideklarasikan untuk memiliki tipe data spesifik ini dan tipe ini hanya dari bagian
sangat awal.
Pada kode yang diberikan, dua instances dari class BasicGeneric terbentuk.
BasicGeneric <String> basicGeneric = new
BasicGeneric <String>(data1);
String data2 = basicGeneric.getData();
B
asicGeneric <Integer> basicGeneric = new
BasicGeneric <Integer>(data1);
Integer data2 = basicGeneric.getData();
Perlu diperhatikan perhatian bahwa instantiasi dari class generic adalah hanya sama
dengan instantiasi sebuah class normal kecuali bahwa tipe data khusus berada dalam
<> menggantikan nama konstruktor. Informasi tambahan ini mengindikasikan tipe dari
data anda akan bekerja dengan siapa untuk bagian instance ini dari class
BasicGeneric.Setelah instantiasi, anda dapat mengakses anggota dari class melalui
instance sekarang. Tidak ada yang lebih diperlukan untuk typecast nilai pengembalian
dari method getData sejak diputuskan bahwa ini akan bekerja dengan sebuah referensi
tipe data yang spesifik.
13.3.1 Pembatasan"Primitive"
Sebuah pembatasan type generic dalam Java adalah mereka dibatasi oleh tipe referensi
dan tidak akan bekerja dengan tipe data primitive.
Sebagai contoh, pernyataan berikut akan menjadi illegal sejak int adalah sebuah tipe
data primitive.
BasicGeneric <int> basicGeneric = new
BasicGeneric <int>(data1);
Petama-tama Anda akan menyelesaikan type primitive sebelum menggunakan mereka
sebagai arguments ke sebuah type generic.
13.3.2 Meng-compilasi Generic
Untuk meng-compile source codes Java denagn type generic menggunakan JDK (v.
J.E.N.I.
Pengenalan Pemrograman 2 5
1.5.0), gunakan syntax berikut ini :
j
avac -version -source "1.5" -sourcepath src -d classes
src/SwapClass.java
Dimana src mengarah pada lokasi dari source code java sementara class mengarah pada
lokasi dimana file class akan disimpan.
Beriut ini sebuah contoh :
javac -version -source "1.5" -sourcepath c:\temp -d c:\temp
c:/temp/SwapClass.java
13.4 Constrained Generic
Dalam contoh yang diberikan terdahulu, type parameter dari class BasicGeneric dapat
memiliki beberapa referensi tipe data. Ada beberapa kasus, bagaimanapun, dimana anda
ingin untuk membatasi tipe instantiasi yang potensial dari class generic. Java juga
memungkinkan kita untuk membatasi set argument type yang mungkin untuk subtypes
dari sebuah batas type yang diberikan.
Sebagai contoh, kita mungkin ingin untuk mendefinisikan sebuah class generic
ScrollPane yang merupakan sebuah template untuk sebuah Container asli yang telah
dilengkapi dengan fungsi scrolling. Tipe runtime dari sebuah instance dari class ini akan
sering menjadi sebuah subclass dari Container, tapi tipe static atau general adalah
Container yang lebih sederhana.
Untuk membatasi instantiasi tipe dari sebuah class, kita menggunakan kata kunci
extends diikuti oleh class yang membatasi tipe generic sebagai bagian dari tipe
parameter.
Contoh berikut ini membatasi instantiasi tipe dari class ScrollPane ke subtipe dari class
Container.
class ScrollPane <MyPane extends Container> {
...
}
c
lass TestScrollPane {
public static void main(String args[]) {
ScrollPane <Panel> scrollPane1 = new
ScrollPane <Panel>();
// pernyataan berikutnya adalah illegal
ScrollPane <Button> scrollPane2 = new
ScrollPane <Button>();
}
}
Instantiasi dari scrollPane1 bernilai valid sejak Panel menjadi sebuah subclass dari class
Container sedangkan kreasi dari scrollPane2 akan menyebabkan munculnya compile
time error sejak Button bukan merupakan sebuah subclass dari Container.
menggunakan generic constrained yang dapat memberikan kita penambahan
J.E.N.I.
Pengenalan Pemrograman 2 6
pengecekan tipe static. Sebagai sebuah hasil, kita akan menjamin bahwa setiap
instantiasi dari tipe generic yang melekat pada batas yang kita miliki.
Sejak kita yakin bahwa setiap tipe instantiasi adalah sebuah subclass dari batas yang
dimiliki, kita dapat memanggil beberapa method secara aman yang ditemukan dalam
objek static tipe. Jika kita belum menempatkan beberapa batas eksplisit pada
parameternya, default batas adalah Object. Ini berarti bahwa kita tidak dapat
menjalankan method pada sebuah instance dari batas yang tidak ditampilkan dalam
class Object.
13.5 Mendeklarasikan sebuah Method Generic
Disamping mendeklarasikan sebuah class generic, Java juga memberi kita perlakuan
khusus untuk mendeklarasikan sebuah method generic. ini disebut dengan method
polymorphic, yang mana didefinisikan menjadi method yang diberi nilai parameter
berupa tipe.
method parameterisasi sangat membantu kita kita ingin untuk menampilkan tugas
dimana ketergantungan tipe antara argument dan nilai pengembalian aslinya merupakan
generic, tapi generic sebenarnya tidak mempercayakan pada beberapa tipe level class
informasi dan akan merubah dari method call ke method call.
Sebagai contoh, Andaikata kita menginginkan untuk menambahkan sebuah method
make untuk sebuah class ArrayList. Method static ini akan diambil dalam sebuah
argument tunggal, yang mana akan menjadi satu-satunya elemen dari object ArrayList.
Untuk membuat generic ArrayList kita, sebagai penampung beberapa tipe elemen,
argumen tunggal dalam method make harus memiliki sebuah tipe generic sebagai
sebuah argumen dan sebagai sebuah tipe nilai kembalian.
Untuk mendeklarasikan tipe generic pada level method, pertimbangkan contoh berikut
ini :
c
lass Utilities {
/* T secara implisit extends terhadap Object */
public static <T> ArrayList<T> make(T first) {
return new ArrayList<T>(first);
}
}
Java juga menggunakan sebuah mekanisme type-inference untuk secara otomatis
menyimpulkan tipe method polymorphic berdasarkan pada tipe-tipe argumennya. Ini
mengurangi panjang dan kompleksitas dari sebuah alur untuk menjalankan suatu
method.
Untuk membangun sebuah instance baru dari ArrayList<Integer>, kita mempunyai cara
yang cukup sederhana yaitu pernyataan berikut :
Utilities.make(Integer(0));
J.E.N.I.
Pengenalan Pemrograman 2 7
13.6 Latihan
13.6.1 Swapping
Membentuk sebuah class dengan sebuah versi generic dari method printSwapped.
Method ini menukar secara sederhana nilai dari parameternya secara lokal dan mencetak
nilainya. Catatan bahwa pencetakan harus dilakukan pada method ini. Mencetak nilai
dari argument dalam method lain tidak akan bekerja karena Java melewatkan object ke
method melalui suatu nilai. Uji method ini pada object Integer, object String dan object
ArrayList.

Stream I/O Lanjut

BAB 12
Stream I/O Lanjut
12.1 Tujuan
Dalam module sebelumnya, Anda telah mempelajari bagaimana untuk mendapatkan
input user dan memanipulasi file-file menggunakan strea. Kini Anda akan mempelajari
lebih banyak tentang stream dan class-class stream yang lain.
Pada akhir pembahasan, diharapkan pembaca dapat :
1. Tahu tipe-tipe stream yang umum digunakan
2. Menggunakan class File dan methodnya
 Karakter dan Stream byte
 Input dan Output Streams
 Node dan Filter Streams
3. Menggunakan class-class Input/Output yang berbeda
 Reader
 Writer
 InputStream
 OutputStream
4. Memahami konsep dari stream chaining
5. Mendefinisikan serialisasi
6. Memahami penggunaan dari kata kunci transient
7. Menulis dan membaca dari sebuah object stream
12.2 Tipe-Tipe Stream yang Umum Digunakan
12.2.1 Stream Karakter dan Byte
Seperti yang telah disebutkan sebelumnya, secara umum ada dua tipe dari stream, yaitu
stream karakter dan byte. Kita hanya mengulang perbedaan mendasar antara
keduanya. Stream byte adalah abstraksi file atau alat untuk data biner sedangkan
stream karakter adalah untuk karakter Unicode.
Class InputStream adalah abstraksi class root untuk semua input stream byte sedangkan
class OutputStream adalah class root abstraksi dari semua output stream byte. Untuk
stream karakter, superclasss yang sesuai dari semua class-class secara berturut-turut
adalah class Reader dan the Writer. Kedua class-class ini adalah abstraksi class-class
untuk membaca dan menulis stream karakter.
12.2.2 Input dan Output Stream
Stream juga dikategorikan berdasarkan apakah mereka digunakan untuk membaca atau
menulis stream.Walaupun ini sudah cukup nyata, Anda diperbolehkan untuk membaca
J.E.N.I.
Pengenalan Pemrograman 2 2
dari input stream tapi tidak menulisnya. Di lain pihak, Anda diperbolehkan untuk menulis
output streams tapi tidak membacanya.
Class InputStream dan class Reader adalah superclass-superclass dari semua input
stream. Class OutputStream dan class Writer adalah class-class root dari semua output
stream.
Input stream juga dikenal sebagai stream sumber (source stream) sejak kita
memperoleh informasi dari stream ini. sementara itu output stream disebut juga stream
hasil(sink stream).
12.2.3 Node dan Stream Filter
Kini package java.io membedakan antara node dan stream filter. Sebuah stream node
adalah sebuah stream dengan fungsi dasar berupa fungsi membaca atau menulis dari
sebuah lokasi khusus seperti pada disk atau dari jaringan. Tipe-tipe dari stream node
terdiri atas file, memory dan jalur data. Stream filter, di lain pihak, diletakkan pada layer
stream node diantara threads atau proses untuk menyediakan fungsi tambahan yang
tidak dapat ditemukan dalam stream node oleh stream node itu sendiri. Penambahan
lapisan pada sebuah stream node disebut dengan stream chaining.
Sesi ini berturut-turut mempunyai sebuah tujuan dari class-class stream yang berbeda.
Untuk melengkapi daftar dari class-class ini, lihatlah pada dokumentasi Java's API.
J.E.N.I.
Pengenalan Pemrograman 2 3
12.3 Class File
Walaupun class File bukan merupakan class stream, ini sesuatu yag penting bahwa kita
mempelajari ini sejak class-class stream merupakan file-file yang telah dimanipulasi.
Class adalah sebuah perwakilan dari abstraksi dari file-file nyata dan nama path
direktori.
Untuk meng-instantiate sebuah object File, Anda dapat menggunakan constructor
berikut ini:
Sebuah Constructor File
File(String pathname)
Instantiate sebuah object File dengan nama path khusus sebagai nama filenya. Nama
filenya mungkin salah satu menjadi penuh( sebagai contoh, isi dengan path yang
lengkap) atau mungkin terdiri atas namafile itu sendiri dan diasumsikan menjadi diisi
dalam direktori tersebut.
Table 1.2a: Constructor File
Class File menyediakan beberapa method untuk memanipulasi file dan direktori. Berikut
ini beberapa dari method-method tersebut.
Method-method File
public String getName()
Mengembalikan nilai nama file atau nama direktori dari object File ini.
public boolean exists()
Menguji apakah sebuah file atau sebuah direktori masih ada atau tidak
public long length()
Mengembalikan nilai ukuran dari file.
public long lastModified()
Mengembalikan nilai tanggal dalam milidetik ketika file terakhir kali dimodifikasi.
public boolean canRead()
Mengembalikan nilai true jika dijinkan untuk membaca dari file. Sebaliknya, nilai
pengembaliannya bernilai false.
public boolean canWrite()
mengembalikan nilai true jika diijinkan untuk menulis ke sebuah file. Sebaliknya, nilai
pengembaliannya bernilai false.
public boolean isFile()
Menguji apakah object ini berupa sebuah file, yaitu persepsi normal kita tentang apa itu
sebuah file (bukan sebuah direktori) atau bukan.
public boolean isDirectory()
menguji apakah object ini adalah sebuah direktori atau bukan.
public String[] list()
J.E.N.I.
Pengenalan Pemrograman 2 4
Method-method File
Mengembalikan nilai daftar file dan subdirektori yang ada dalam object ini. Object ini
haruslah berupa sebuah direktori.
public void mkdir()
Membuat sebuah direktori yang merupakan abstraksi nama path ini.
public void delete()
Membuang file atau direktori yang sebenarnya diwakili oleh object File tersebut.
Table 1.2a: method-method File
Mari kita melihat bagaimana method ini bekerja berdasarkan contoh berikut ini :
i
mport java.io.*;
p
ublic class FileInfoClass {
public static void main(String args[]) {
String fileName = args[0];
File fn = new File(fileName);
System.out.println("Name: " + fn.getName());
if (!fn.exists()) {
System.out.println(fileName + " does not exists.");
/* membuat sebuah temporary directory . */
System.out.println("Creating temp directory...");
fileName = "temp";
fn = new File(fileName);
fn.mkdir();
System.out.println(fileName +
(fn.exists()? "exists": "does not exist"));
System.out.println("Deleting temp directory...");
fn.delete();
System.out.println(fileName +
(fn.exists()? "exists": "does not exist"));
return;
}
System.out.println(fileName + " is a " +
(fn.isFile()? "file." :"directory."));
if (fn.isDirectory()) {
String content[] = fn.list();
System.out.println("The content of this directory:");
for (int i = 0; i < content.length; i++) {
System.out.println(content[i]);
}
}
if (!fn.canRead()) {
System.out.println(fileName + " is not readable.");
return;
}
System.out.println(fileName + " is " + fn.length() +
" bytes long.");
System.out.println(fileName + " is " + fn.lastModified()
+ " bytes long.");
if (!fn.canWrite()) {
J.E.N.I.
Pengenalan Pemrograman 2 5
System.out.println(fileName + " is not writable.");
}
}
}
12.4 Class Reader
Bagian ini menggambarkan stream karakter yang digunakan untuk membaca.
12.4.1 Method Reader
Class Reader terdiri atas beberapa method untuk membaca karakter. berikut ini adalah
beberapa method class :
Method Reader
public int read(-) throws IOException
Sebuah method overload, yang mana memiliki tiga versi. Membaca karakter, segala
karakter array atau sebuah porsi untuk sebuah karakter array.
public int read() - membaca sebuah karakter tunggal.
public int read(char[] cbuf)- Membaca karakter dan menyimpannya dalam
karakter array cbuf.
public abstract int read(char[] cbuf, int offset, int length)- Membaca
karakter sejumlah panjang karakter tertentu dan menyimpannya dalam karakter cbuf
dimulai pada tanda offset khusus yang telah ditentukan.
public abstract void close() throws IOException
Menutup Stream ini. Memanggil method Reader yang lain setelah menutup stream akan
menyebabkan suatu IOException dijalankan.
public void mark(int readAheadLimit) throws IOException
Menandai posisi tertentu pada stream. Setelah menandai, panggil untuk melakukan
reset() kemudian stream akan mencoba mengatur posisinya kembali pada titik ini.
Tidak semua stream input karakter mendukung operasi ini.
public boolean markSupported()
mengindikasikan apakah sebuah stream mendukung operasi pemberian tanda (mark)
atau tidak Tidak didukung oleh default. Seharusnya bersifat overid subclass.
public void reset() throws IOException
Reposisi stream ke posisi akhir stream yang telah ditandai
Table 1.3.1: Method Reader
12.4.2 Class Node Reader
Berikut ini adalah beberapa dasar class Reader:
J.E.N.I.
Pengenalan Pemrograman 2 6
Class-class Node Reader
FileReader
Untuk membaca file-file karakter.
CharArrayReader
Mengimplementasikan suatu karakter buffer yang dapat dibaca.
StringReader
Untuk membaca dari sebuah sumber string.
PipedReader
Digunakan untuk pasangan (dengan sebuah PipedWriter yang sesuai) oleh dua urutan
yang ingin berkomunikasi. Salah satu dari urutan tersebut membaca karakter dari
sumber tertentu.
Table 1.3.2: Class-class Node Reader Classes
12.4.3 Class-Class Filter Reader
Untuk menambah fungsi ke class-class dasar Reader, Anda dapat menggunakan class
stream filter. Berikut ini adalah beberapa dari class-class tersebut :
Class-Class Filter Reader
BufferedReader
mengizinkan penyimpanan sementara karakteryang bertujuan untuk menyediakan
fasilitas pembacaan karakter, arrays, dan bais yang lebih efisien.
FilterReader
Untuk membaca stream karakter yang telah terfilter.
InputStreamReader
Menkonversi pembacaan byte ke bentuk karakter.
LineNumberReader
Sebuah subclass dari class BufferedReader yang dapat menjaga memori penyimpanan
untuk nomor baris.
PushbackReader
Sebuah subclass dari class FilterReader yang memungkinkan karakter dikembalikan
atau tidak terbaca oleh stream.
Table 1.3.3: Class-class Filter Reader
J.E.N.I.
Pengenalan Pemrograman 2 7
12.5 Class-Class Writer
Pada pembahasan ini menjelaskan tentang stream karakter yang digunakan untuk
menulis.
12.5.1 Writer Method
Class Writer terdiri atas beberapa method untuk menulis karakter. Berikut ini adalah
beberapa method class :
Method Writer
public void write(-) throws IOException
Sebuah method overloading dalam lima versi:
public void write(int c) – Menulis sebuah karakter tunggal yang diwakili oleh
pemberian nilai integer.
public void write(char[] cbuf) – Menulis isi dari karakter array cbuf.
public abstract void write(char[] cbuf, int offset, int length) – Menulis
sejumlah length karakter dari aaray cbuf, dimulai pada offset tertentu.
public void write(String str) – Menulis string string.
public void write(String str, int offset, int length) – Menulis sejumlah
length karakter dari string str, dimulai pada offset tertentu.
public abstract void close() throws IOException
Menutup stream ini setelah flushing beberapa karaktr yang tidak tertulis. Invocation
method lain setelah menutup stream ini akan menyebabkan terjadinya IOException.
public abstract void flush()
Mengganti stream(yaitu karakter yang disimpan dalam buffer dengan segera ditulis ke
tujuan yang dimaksud).
Table 1.4.1: Method Writer
12.5.2 Node Writer Classes
Berikut ini beberapa dasar class Writer:
Node Writer Classes
FileWriter
Untuk menulis karakter ke sebuah file.
CharArrayWriter
Menggunakan karakter penyangga yang dapat dituliskan juga.
StringWriter
Untuk menulis source string
PipedWriter
J.E.N.I.
Pengenalan Pemrograman 2 8
Node Writer Classes
Digunakan dengan berpasangan(dengan menghubungkan PipedReader) oleh dua thread
yang ingin berkomunikasi. Satu dari thread ini menulis karakter ke stream ini.
Table 1.4.2: Node Writer classes
12.5.3 Filter Writer Classes
Untuk menambah fungsionalitas ke dasar class Writer, Anda dapat menggunakan class
stream filter.Terdapat beberapa class-class:
Filter Writer Classes
BufferedWriter
Menyediakan penyangga karakter bertujuan untuk menyediakan efisiensi penulisan
karakter, array, dan garis.
FilterWriter
Untuk menulis stream karakter yang difilter.
OutputStreamWriter
Mengkodekan karakter yang ditulis ke dalam byte.
PrintWriter
Mencetak representasi yang diformat dari object ke dala stream text-output.
Table 1.4.3: Filter Writer classes
12.6 Contoh Dasar Reader/Writer
Contoh penggantian menggunakan class FileReader dan FileWriter. Dalam contoh ini,
program membaca dari file yang khusus oleh user dan mengkopi isi dari file ke file lain.
i
mport java.io.*;
c
lass CopyFile {
void copy(String input, String output) {
FileReader reader;
FileWriter writer;
int data;
try {
reader = new FileReader(input);
writer = new FileWriter(output);
while ((data = reader.read()) != -1) {
writer.write(data);
}
reader.close();
writer.close();
} catch (IOException ie) {
ie.printStackTrace();
}
J.E.N.I.
Pengenalan Pemrograman 2 9
}
public static void main(String args[]) {
String inputFile = args[0];
String outputFile = args[1];
CopyFile cf = new CopyFile();
cf.copy(inputFile, outputFile);
}
}
Cobalah program tersebut sendiri dan amatilah apa ang terjadi pada file yang
dimanipulasi.
12.7 Merubah Contoh Reader/Writer
Contoh pengganti hampir sama dengan contoh sebelumnya tetapi lebih efisien.
Walaupun membaca dan menulis ke stream sekali saja, karakter membaca yang
pertama disimpan dalam buffer sebelum penulisan karakter baris per baris. Program
menggunakan teknik dari perangkaian stream dimana clas FileReader dan FileWriter
didekorasi dengan class BufferedReader dan BufferedWriter, berurutan.
import java.io.*;
c
lass CopyFile {
void copy(String input, String output) {
BufferedReader reader;
BufferedWriter writer;
String data;
try {
reader = new BufferedReader(new FileReader(input));
writer = new BufferedWriter(new FileWriter(output));
while ((data = reader.readLine()) != null) {
writer.write(data, 0, data.length());
}
reader.close();
writer.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
public static void main(String args[]) {
String inputFile = args[0];
String outputFile = args[1];
CopyFile cf = new CopyFile();
cf.copy(inputFile, outputFile);
}
}
Bandingkan kode ini dengan sebelumnya. Apakah hasil dari menjalankan program ini?
J.E.N.I.
Pengenalan Pemrograman 2 10
12.8 Class InputStream
Bagian ini memberikan gambaran perbedaan stream byte yang digunakan membaca.
12.8.1 Method InputStream
Class InputStream terdiri atas beberapa method untuk membaca byte. Beberapa method
class:
Method InputStream
public int read(-) throws IOException
Method overloaded, juga memiliki tiga versi seperti class Reader tersebut.
public abstract int read() - Membaca byte selanjutnya dari data dari stream ini.
public int read(byte[] bBuf)- Membaca sejumlah byte dan menyimpannya dalam
byta array bBuf.
public abstract int read(char[] cbuf, int offset, int length)- Membaca
panjang sejumlah length byte dan menyimpannya dalam array byte bBuf dimulai dari
offset tertentu.
public abstract void close() throws IOException
Menutup stream in. Memanggil method InputStream yang lain setelah menutup
streamnya akan menyebabkan sebuah IOException dijalankan.
public void mark(int readAheadLimit) throws IOException
Menandai posisi tertentu dalam stream. Setelah menandainya, panggil untuk
menjalankan fungsi reset() akan mencoba untuk mengatur posisi streamnya pada titik
tertentu kembali. Tidak semua stream input-byte mendukung operasi ini.
public boolean markSupported()
Mengindikasikan apakah suatu stream mendukung operasi pemberian tanda (mark) dan
reset. Yang tidak didukung secara default. Seharusnya diubah menjadi overide oleh
subclass.
public void reset() throws IOException
Merubah posisi stream pada posisi akhir yang diberi tanda (mark)
Table 1.7.1: Method InputStream
12.8.2 Class-Class Node InputStream
Berikut ini merupakan beberapaclass-class dasar InputStream :
Class-class Node InputStream
FileInputStream
Untuk membaca baris byte dari sebuah file
BufferedArrayInputStream
J.E.N.I.
Pengenalan Pemrograman 2 11
Class-class Node InputStream
Mengimplementasikan sebua penimpan sementara yang terdiri atas data byte, yang
mungkin dpat dibaca dari streamnya.
PipedInputStream
Seharusnya terhubung ke sebuah PipedOutputStream. Stream ini secara khusus
digunakan oleh dua urutan yang didalamnya satu dari urutan tersebut membaca data
dari sumber ini sementara urutan yang lain menulis ke PipedOutputStream tujuan.
Table 1.7.2: class-class Node InputStream
12.8.3 Class-class Filter InputStream
Untuk menambah fungsi ke class dasar InputStream, Anda dapat menggunakan class
stream filter. Berikut ini adalah beberapa dari class-class tersebut :
Class-class Filter InputStream
BufferedInputStream
Sebuah subclass dari FilterInputStream yang memungkinkan penyimpanan input
sementara untuk menyediakan pembacaan byte yang lebih efisien.
FilterInputStream
Untuk membaca byte stream yang telah terfilter, yang mungkin memindahkan source
dasar dari data sepanjang proses dan menyediakan fungsi tambahan.
ObjectInputStream
Digunakan untuk serialisasi object. Deserialisasi object dan data primitif yang telah
tertulis sebelumnya menggunakan sebuahObjectOutputStream.
DataInputStream
Sebuah subclass dari FilterInputStream yang memerintahkan sebuah aplikasi membaca
data primitif Java dari sebuah input stream dasar dalam sebuah Mesin yang berjalan
secara bebas(machine-independent way).
LineNumberInputStream
Sebuah subclass FilterInputStream yang memungkinkan pemeriksaan posisi dari nomor
baris tertentu.
PushbackInputStream
Sebuah subclass dari class FilterInputStream yang memungkinkan byte diproses balik
atau tidak dibaca ke bentuk sreamnya.
Table 1.7.3: Class-class Filter InputStream
J.E.N.I.
Pengenalan Pemrograman 2 12
12.9 Class-Class OutputStream
Pada pembahasan ini memberikan sebuah pandangan tentang byte stream yang berbeda
yang digunakan dalam proses penulisan.
12.9.1 Method OutputStream
Class OutputStream terdiri atas beberapa method untuk menulis data byte. Berikut ini
adalah beberapa dari class methodnya :
Method OutputStream
public void write(-) throws IOException
Sebuah method overloaded untuk menulis bentuk byte ke bentuk stream. Ada tiga versi
:
public abstract void write(int b) – Menulis nilai byte khusus b ke bentuk output
stream nya.
public void write(byte[] bBuf) – Menulis isi dari array byte bBuf ke bentuk stream
nya.
public void write(byte[] bBuf, int offset, int length) – Menulis sejumlah
length byte dari array bBuf ke bentuk streamnya, dimulai pada offset khusus ke
streamnya.
public abstract void close() throws IOException
Menutup stream ini dan mengeluarkan beberapa sumber dari sistem digabungkan
dengan streamnya. Penggunaan method lain setelah memanggil method ini akan
menyebabkan sebuahIOException dijalankan.
public abstract void flush()
Mengganti stream (sebagai contoh, data byte tersimpan dalam buffer akan segera
ditulis dalam tujuan yang diamksud).
Table 1.8.1: Method OutputStream
12.9.2 Class-Class Node OutputStream
Berikut ini adalah beberapa dari class dasar OutputStream :
Clas-class Node OutputStream
FileOutputStream
Untuk menulis byte ke sebuah file.
BufferedArrayOutputStream
Mengimplementasikan sebuah penyimpan sementara berupa byte, yang mana mungkin
akan dituliskan ke bentuk streamnya.
PipedOutputStream
J.E.N.I.
Pengenalan Pemrograman 2 13
Clas-class Node OutputStream
Seharusnya tersambung ke sebuah PipedInputStream. Stream ini secara khusus
digunakan oleh dua urutan dimana didalamnya satu dari urutan tersebut menulis data
ke bentuk streamnya sementara urutan yang lain membaca dari PipedInputStream
tujuan.
Table 1.8.2: Class-class Node OutputStream
12.9.3 Class-Class Filter OutputStream
Untuk menambah fungsi ke class dasar OutputStream, Anda dapat menggunakan class
stream filter.berikut ini beberapa dari class tersebut :
Class-Class Filter OutputStream
BufferedOutputStream
Sebuah subclass dari FilterOutputStream yang memungkinkan penyimpanan output
sementara untuk proses penulisan byte yang lebih efisien. Memungkinkan penulisan
byte ke bentuk dasar output stream tanpa menyebabkan diperlukannya pemanggilan
dasar sistem untuk setiap penulisan byte.
FilterOutputStream
Untuk menulis stream byte yang telah difilter, yang mana mungkin dipindahkan ke
source dasar dari data sepanjang proses dan menyediakan fungsi tambahan.
ObjectOutputStream
Digunakan untuk serialisasi object. Serialisasi object dan data primitif untuk sebuah
OutputStream.
DataOutputStream
Sebuah subclass dari FilterOutputStream yang menjalankan aplikasi penulisan data
primitif ke output stream dasar ke dalam sebuah mesin yang bebas berjalan (machineindependent
way).
PrintStream
Sebuah subclass dari FilterOutputStream yang menyediakan kemampuan untuk
mencetak representasi dari nilai data yang bermacam-macam dengan tepat.
Table 1.8.3: Class-Class Filter OutputStream
J.E.N.I.
Pengenalan Pemrograman 2 14
12.10 Contoh Dasar InputStream/OutputStream
Contoh berikut ini menggunakan class FileInputStream dan FileOutputStream untuk
membaca dari sebuah file khusus dan mengcopy isi dari file ini ke file yang lain.
i
mport java.io.*;
c
lass CopyFile {
void copy(String input, String output) {
FileInputStream inputStr;
FileOutputStream outputStr;
int data;
try {
inputStr = new FileInputStream(input);
outputStr = new FileOutputStream(output);
while ((data = inputStr.read()) != -1) {
outputStr.write(data);
}
inputStr.close();
outputStr.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
public static void main(String args[]) {
String inputFile = args[0];
String outputFile = args[1];
CopyFile cf = new CopyFile();
cf.copy(inputFile, outputFile);
}
}
J.E.N.I.
Pengenalan Pemrograman 2 15
12.11 Contoh Modifikasi
InputStream/OutputStream
Contoh berikutnya menggunakan class PushbackInputStream yang memanfaatkan
sebuah object FileInputStream dan class PrintStream.
i
mport java.io.*;
c
lass CopyFile {
void copy(String input) {
PushbackInputStream inputStr;
PrintStream outputStr;
int data;
try {
inputStr = new PushbackInputStream(new
FileInputStream(input));
outputStr = new PrintStream(System.out);
while ((data = inputStr.read()) != -1) {
outputStr.println("read data: " + (char) data);
inputStr.unread(data);
data = inputStr.read();
outputStr.println("unread data: " + (char) data);
}
inputStr.close();
outputStr.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
public static void main(String args[]) {
String inputFile = args[0];
CopyFile cf = new CopyFile();
cf.copy(inputFile);
}
}
Uji kode ini pada sebuah file yang mengandung sedikit baris atau karakter.
J.E.N.I.
Pengenalan Pemrograman 2 16
12.12 Serialisasi
Java Virtual Machine (JVM) mendukung kemampuan untuk membaca atau menulis
sebuah object ke bentuk stream. kemampuan ini disebut dengan serialisasi, proses
"flattening" sebuah object sehingga data tersebut dapat disimpan ke beberapa
penyimpanan permanen atau dilewatkan ke object lain melalui class OutputStream.
Ketika menulis sebuah object, ini merupakan hal yang penting bahwa keadaan tersebut
sudah tertulis dan telah diserialisasi dari setiap objectnya dapat dibangun kembali
sebagaimana dtaa tersebut dibaca. Menyimpan sebuah objectke beberapa tipe
penyimpanan permanen yang dikenal sebagai persistence.
Stream yang digunakan untuk deserialisasi dan serialisasi secara berurutan adalah class
ObjectInputStream dan ObjectOutputStream .
Untuk memungkinkan sebuah object diserialisasi (sebagai contoh dapat disimpan dan
diurutkan), Class tersebut harus mengimplementasikan interface yang dapat
diserialisasi. Class ini seharusnya juga menyediakan default constructor atau sebuah
constructor tanpa argumen. Satu hal yang baik mengenai kemampuan untuk melakukan
serialisasiyang dapat diturunkan, yang berarti kita tidak memiliki implementasi
serialisasi pada setiap class. Ini berarti mengurangi pekrjaan untuk programmer. Anda
hanya dapat mengimplementasikan serialisasi sekali sepanjang hirarki class.
12.12.1 Kata Kunci transient
Ketika suatu object diserialisasi, tempat hanya disediakan untuk data object. Method dan
Constructor bukan merupakan bagian dari stream serialisasi. Ada beberapa object yang
tidak diserialisasi kaena data yang diwakilinya berubah secara konstan. Beberapa contoh
dari setiap object adalah object FileInputStream dan Object Thread. Sebuah
NotSerializableException dijalankan jika operasi serialisasi gagal karena beberapa
alasan.
Jangan berputus asa. Sebuah class yang mengandung object yang tidak diserialisasi
dapat tetap diserialisasi jika penunjuk ke object non-serialisasi ditandai dengan
katakunci transient. Pertimbangkan contoh berikut ini :
class MyClass implements Serializable {
transient Thread thread; //try removing transient
int data;
/* beberapa data yang lain*/
}
Kata kunci transient mencagah data dari proses serialisasi. Object instantiasi dari class
ini sekarang dapat ditulis ke sebuah OutputStream.
12.12.2 Serialisasi: Menulis Suatu Object Stream
Untuk menulis object ke sebuah stream, Anda perlu menggunakan
classObjectOutputStream class dan methodnya yaitu method writeObject. Method
writeObject memiliki tanda sebagai berikut :
public final void writeObject(Object obj) throws IOException
dimana obj adalah object yang ditulis ke stream.
J.E.N.I.
Pengenalan Pemrograman 2 17
Contoh dibawah ini menuliskan sebuah object Boolean ke sebuah ObjectOutputStream.
Class Boolean mengimplementasikan interface yang dapat di Serialisasi. Selanjutnya,
Instantiasi object dari class ini dapat ditulis ke dan dibaca dari sebuah stream.
i
mport java.io.*;
p
ublic class SerializeBoolean {
SerializeBoolean() {
Boolean booleanData = new Boolean("true");
try {
FileOutputStream fos = new
FileOutputStream("boolean.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(booleanData);
oos.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
public static void main(String args[]) {
SerializeBoolean sb = new SerializeBoolean();
}
}
12.12.3 Deserialisasi: Membaca Sebuah Object Stream
Untuk membaca sebuah object dari sebuah stream, Anda perlu menggunakan class
ObjectInputStream dan methodnya yaitu method readObject. Method readObject
memiliki tanda sebagai berikut :
p
ublic final Object readObject()
throws IOException, ClassNotFoundException
dimana obj adalah object yang dibaca dari stream. tipe Object dikembalikan harus
melalui proses typecast ke nama class yang sesuai sebelum method pada class tersebut
dapat dieksekusi.
Contoh dibawah ini membaca sebuah object Boolean dari sebuah ObjectInputStream. Ini
merupakan kesinambungan dari contoh sebelumnya pada serialisasi.
i
mport java.io.*;
p
ublic class UnserializeBoolean {
UnserializeBoolean() {
Boolean booleanData = null;
try {
FileInputStream fis = new
FileInputStream("boolean.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
booleanData = (Boolean) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
J.E.N.I.
Pengenalan Pemrograman 2 18
}
System.out.println("Unserialized Boolean from " +
"boolean.ser");
System.out.println("Boolean data: " + booleanData);
System.out.println("Compare data with true: " +
booleanData.equals(new Boolean("true")));
}
public static void main(String args[]) {
UnserializeBoolean usb = new UnserializeBoolean();
}
}
12.13 Latihan
12.13.1 Enkripsi Sederhana
Baca dari sebuah file khusus oleh user dan encrypt isi file menggunakan teknik
penggeseran yang sederhana. Juga, tanyakan pada user untuk menginput ukuran
pergeseran. Output dari pesan yang telah di encrypt pada file yang lain yang memiliki
nama yang juga dibuat oleh user sendiri.
Sebagai contoh,
Ukuran pergeseran: 1
Pesan yang dibaca dari file: Hello
Pesan ter-encrypt: Ifmmp