me and BeanShell

Recently I got an assignment to fool around with a java library, Since I
kind in bad mood, I was thinking a way to fool around with an easy
way, not using code, compile, see because it’s just too much work. So
I remember about java scripting, there are lot of scripting in java
today, here some of it bsh, groovy, jacl, jython, rhino and others.

So I’ve to pick up one from many, I started with bsh, since the
syntax resembling java syntax with some improvement (pre java 5.0). So
I started to download it [ in ubuntu bsh already in synaptix ], and
start to playing around with it.

my first problem is how to add a jar to bsh classpath, luckily in bsh
documentation, there is a command to add jar into classpath,
here’s my snippet

BeanShell 2.0b4 - by Pat Niemeyer (pat@pat.net)
bsh % addClassPath("lib/my.jar");
addClassPath("lib/my.jar");
bsh %

after that, I smoothly played around with the API. so bsh can be a
tool for black-box testing, and I quite satisfied using it. I know
that the other scripting can be use for it, but for now I keep with
bsh for black box testing.

doLearn(“Generics”,2)

Generic juga bisa diterapkan pada deklarasi sebuah kelas. contoh
klasiknya adalah sebagai berikut:

public class Pair<T,V>{
	T key = null;
	V value = null;
	public Pair(T t, V v){
		this.key = t;
		this.value =v;
	}

	public V get(T t){
		return value;
	}

	@Override
	public String toString(){
		return "key = "+key+" value ="+value;
	}

	public static void main(String[] args){
		Pair<String,String> pString = new Pair<String,String>("Hello","world");
		System.out.println(pString);

		Pair<String,Integer>pStrInt = new Pair<String, Integer>("This",1);
		System.out.println(pStrInt);
	}
}

hasil dari eksekusi program diatas adalah

key = Hello value =world
key = This value =1

tentu saja generic diatas, hanya salah satu contoh penerapan generic
pada sebuah kelas.

nah bagaimana cara mengartikan generic diatas?
seperti telah kita ketahui, bahwa generic tidak merubah bytecode hasil
dari kompilasi kelas pada java, sehingga untuk lebih mudahnya kita
dapat mengasumsikan bahwa sebelum proses kompilasi java merubah dari
kode java ke bytekode, terjadi perubahan dimana (contoh 1 dari
Pair) character generic ‘V’ diubah menjadi
String,sedangkan ‘T’ menjadi String. dan pada begitu juga pada code
Pair dimana ‘T’ menjadi String, dan ‘V’ menjadi
Integer.

dari sini bisa menimbulkan pertanyaan apakah

Pair<String,String>

dan

Pair<String,Integer>

adalah 2 kelas yang sama?, yap dua contoh itu adalah 2 kelas yang
sama, hal ini bisa dibuktikan dengan


Pair<String,String> pString = new Pair<String,String>("Hello","world");
Pair<String,Integer>pStrInt = new Pair<String, Integer>("This",1);
assert pString.getClass() == pStrInt.getClass();

Thread dan java

Apa itu Thread?

Kalo ditanya apakah itu thread? susah untuk menjawab, yang jelas
thread itu adalah sebuah konsep abstrak untuk proses yang dilakukan
oleh komputer untuk menyelesaikan sebuah tugas.

Apa perbedaan antara Thread dan Process

Didalam konsep OS, ada 2 buah istilah yang digunakan untuk sebuah
proses menyelesaikan tugas, Thread dan Process.

Thread adalah Lightweight sedangkan Process adalah HeavyWeight, Satu
atau lebih thread bisa dipunyai oleh process. antara 1 Thread dan
thread lainya sama2 menggunakan Heap yang sama, sedangkan 1 Process
dan process yang lain menggunakan Heap yang berbeda. Bisa dianalogikan
process itu dengan applikasi, dalam sebuah OS satu aplikasi dan
aplikasi yang lain akan mempunyai heap yang berbeda, sedangkan dalam 1
applikasi dapat mempunyai 1 atau lebih thread.

Kenapa harus menggunakan Thread?

Paling tidak ada 2 hal yang membuat sebuah program untuk menggunakan
Thread (dalam hal ini java):

  • Membuat GUI lebih responsive
  • Menggunakan resources menjadi lebih efektif.

Bagaimana cara membuat Thread pada Java

  1. Extending Thread

    Thread t = new Thread(){
    public void run(){
    System.out.println("Thread started");
    }
    }
  2. Implementing Runnable

    Thread t = new Thread(new Runnable(){
    public void run(){
    System.out.println("Thread started");
    }
    })

cara diatas hanya untuk menyingkat pengetikan saja, mungkin cara yang
lain adalah

class NewThread extends Thread{...

dan

class NewThread implements Runnable{...

Setelah membuat object dari thread, maka untuk menjalan thread, harus
dengan perintah t.start().

doLearn(“Generics”,1);

Ketika Sun me-release Java 5.0 aka Tiger, banyak terdapat fitur2 baru, ada yang menarik, akan tetapi ada juga yang menurut saya tidak perlu, salah satu fitur yang tidak perlu itu adalah generics. Cukup hanya dengan melihat syntax-nya saja, mampu membuat saya dengan seketika membenci generics

Ada pepatah mengatakan Tidak kenal, maka tidak sayang, maka selagi ada waktu senggang, saya mencoba untuk mengoprek dan memahami generics

Generic dibuat agar para programmer java, tidak perlu melakukan casting, sewaktu mengambil object dari sebuah collection

   /**
   * print kumpulan String dalam list.
   **/
   public void printStringCollection(List list){
      String sTemp = null;
      for(int idx=0;id < list.size();idx++){
        sTemp = (String) list.get(idx);
      }
   }

seperti diliat dari code diatas, kita harus terlebih dahulu melakukan casting, dan tentu saja ada kemungkinan kita salah dalam melakukan casting dan mengakibatkan Exception sewaktu run-time. Hal ini lah yang mengakibatkan Sun memperkenalkan generics. mari kita liat bagaimana kode diatas diganti dengan menggunakan generic

  public void printStringCollection(List list){
     for(String s: list){
        System.out.println(s);
     }
     //atau dapat juga
     //String s = null;
     //for(int idx=0;idx<list.size();idx++){
     // s = list.get(i); //see without casting.
     //}
  }

Woaaaa, cooollll, what’s that with “for-in”, yup2 selain generics Tiger juga memperkenalkan jenis baru dari untuk pelengkap for-loop dengan menggunakan for-in, Akan tetapi yang paling penting adalah, kita tidak perlu menggunakan casting sewaktu berhubungan dengan collection

Diliat dari code diatas sepertinya generics tidak terlalu susah, yang penting hanya menambah “” setelah keyword collection.
is it worthed?, mungkin, hmm.. tapi setelah ini ternyata masih banyak detail2 dari generic yang harus dipelajadi seperti, extends,super, wildcards, nah kalo diliat dari tambahan hal2 yang harus dipelajari sepertinya generics hanya akan menambah tingkat kerumitan java, yang menurut saya sangat tidak perlu. Hmm… mungkin saya harus mempelajari lebih dalam lagi tentang generics,sebelum memutuskan bahwa generics memang tidak perlu :O

Ada satu hal tambahan mengenai generics, apakah dengan segala macam2 pernak pernik ini, membuat bytecode java 5.0 berbeda? ternyata tidak, generic pada java bersifat erasure, mungkin dari kata erase, jadi sewaktu compile, segala pernah-pernik tentang genericsdibuang, sehingga pada akhirnya bytecode dari java 5.0 ttp sama dengan pre-5.0