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();
Advertisements

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().

TCL & uplevel

perintah uplevel digunakan untuk menjalankan perintah2 yang berada di
stack frame yang berbeda, stack frame telah dijelaskan di
https://inthegarage.wordpress.com/2007/06/13/tcl-upvar/,

Mungkin lebih baik langsung pada contoh

proc a {} {
    set x 10
    set y 20

    b
}

proc b {} {
    uplevel 1 {set x 20; puts "nilai dari x : $x"}
    uplevel 1 {incr x 20}
    uplevel 1 {puts $x}
}

dan hasilnya adalah sebagai berikut

%a
nilai dari x : 20
40
% 3

contoh lain dari penggunaan uplevel adalah untuk mengkustomisasi
struktur, misalnya adalah perintah loop yang tidak terdapat pada tcl,
misalnya syntax dari loop adalah loop 1 0 {..}, maka implementasinya
adalah

proc loop {from to body} {
    for {set var $from} {$var < $to} {incr var} {uplevel 1 $body}
}

perintah uplevel pada loop untuk menjalankan perintah pada body, yang
mempunyai 1 level lebih tinggi daripada perintah loop.

TCL & upvar

berdasarkan tcl manual, perintah upvar berguna untuk membuat link
(?hubungan?) ke variabel yang berada pada stack yang berbeda. Syntax
dari perintah upvar sendiri adalah sebagai berikut :

upvar ?level? otherVar myVar ?otherVar myVar ...?

Berdasarkan definisi diatas akan menimbulkan pertanyaan lain, apakah
yang dimaksud dengan lingkup stack (stack frame) yang berbeda?
untuk mengetahui lebih jelasnya, misalkan kita membuat method a, dan
didalam method a tersebut kita memanggil method b, ketika method a
dibuat, maka tcl akan membuat stack frame untuk method a dimana
seluruh local variabel akan disimpan, dan ketika memanggil method b
maka tcl akan membuat lagi stack frame untuk method b, sehingga method
a dan b mempunyai stack frame yang berbeda, dan juga method a dan b
mempunyai level yang berbeda dimana method a mempunyai level 1 (bila
diasumsikan method a dipanggil dari lingkup global), sedangkan method
b mempunyai level 2.
Untuk mengetahui level dari method/procedure dapat digunakan perintah

info level.

Karena method a dan b mempunyai stack frame yang berbeda maka method b
tidak dapat mengaksed variabel yang berada pada method a, nah perintah
upvar dapat membuat method b untuk mengakses variabel yang terdapat
pada method a.

proc top {} {
    set x 10
    bottom
    puts "setelah memanggil bottom $x"

}

proc bottom {} {
   upvar 1 x localx
   incr localx 20
}

setelah kita panggil top

% top 20
setelah memanggil bottom 30
%

selain itu perintah upvar berguna untuk mengimplementasikan
call-by-name procedure, contohnya adalah sebagai berikut.


proc top {topArg} {
    set localArg [expr $topArg+1]
    puts "before calling bottom is : $localArg"
    bottom localArg
    puts "after calling  is : $localArg"
}

proc bottom {bottomArg} {
    upvar $bottomArg arg
    puts "bottom is passed $bottomArg with value $arg"
    incr arg
}

hasilnya bila kita panggil top 30

top 30
before calling bottom is : 31
bottom is passed localArg with value 31
after calling  is : 32

TCL & Scopes

Tcl mempunyai 2 jenis variabel scope (atau mungkin bila diterjemahkan
menjadi lingkup :P).

  • global
  • global variabel dapat diakses diseluruh script, akan tetapi sebuah
    prosedur/method dapat melakukan overshadow global variabel dengan
    mendefinisikan variable lokal dengan nama yang sama.

  • lokal
  • lokal variabel hanya dapat diakses dalam lingkup sebuah fungsi.

bila didalam fungsi/method ingin menggunakan variabel global, maka
kita menggunakan peringah global, berikut ini adalah contoh dari
program yang menggunakan lokal dan global variabel.

set a 10
set b 20

puts "$a $b"

proc test_scope {} {
    global a
    set a "me good"
    set b "but I feel not good"
    puts "$a $b"

}

test_scope
puts "Nilai dari a sekarang : $a"
puts "Nilai dari b sekarang : $b"

hasilnya adalah sebagai berikut.

% source scope.tcl
10 20
me good but I feel not good
Nilai dari a sekarang : me good
Nilai dari b sekarang : 20
%

dapat dilihat pada fungsi test_scope, bahwa global variabel a, dapat
digunakan apabila kita menggunakan perintah global terlebih dahulu.

could not debug in eclipse 3.2

Recently I couldn’t debug my application using eclipse 3.2, it will throw “Could not connect to VM”. And in the console there is a log

FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=JVMTI_ERROR_INTERNAL(113)
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_LOAD(509) ["debugInit.c",L476]
JDWP exit error JVMTI_ERROR_INTERNAL(113): No transports initialized

I am using Ubuntu 7.04, after a googling session, it seems that there are a lot of people have the same problem.

I found the solution in java forum, and add 127.0.0.1 localhost in my /etc/hosts solve the problem.

TCL & Proc

Ok, Sekarang yang akan dibahas adalah proc. Proc adalah perintah yang
digunakan untuk mendefiniskan method. Syntax yang digunakan adalah
sebagai berikut

proc name { arguments } {
    body_method
}

contoh diatas membuat procedure/method dengan nama ‘name’. Tcl
mempunyai global environment untuk menyimpan nama2 procedure, sehingga
bisa dipastikan hanya terdapat 1 buah procedure dengan nama
‘name’. Apabila procedure dengan nama ‘name’ telah terdefinisikan,
maka procedure itu akan digantikan dengan procedure ‘name’ yang baru.

contoh dari procedure

proc add { a b } {
  return [expr $a +$b]
}

argument pada procedure dapat mempunyai default, contoh dari
mendefinisikan procedure yang argument-nya mempunyai nilai default

proc add { {a 10} {b 20} } {
  expr a + b
}

dari contoh diatas, argument b akan mempunyai nilai 20 bila tidak didefinisikan.