Tuesday, December 30, 2008

Java Regular Expressions



Huehuehue ... kalo denger regex(regular expression) jadi inget sama matakuliah teori bahasa dan automata yang bahas2 regular expression dan berkutat pada NDFA, DFA, NFA, PDA, !@#^$#*&^!*&@%*@^# gak ngertilah pokoknya cukup bikin kita pusing, yah lupain dulu deh masalah kuliah ... now lets focus to java regex. Regular expression tak lain adalah cara untuk mendeskripsikan suatu set string berdasarkan karakteristik tertentu. Regex dapat dimanfaatkan untuk melakukan search, edit atau manipulasi text/data. Regex di java hampir mirip dengan regex di perl tidak hanya java/perl hampir semua bahasa mempunyai regex untuk pengolahan text/data. Jadi apapun bahasanya minumnya tetep teh botol sossro.
Java regex sebenarnya cuman berkutat pada package java.util.regex yang mempunyai tiga class yaitu Pattern, Matcher dan PatternSintaxException. Object Pattern mempunyai dua method utama untuk melakukan manipulsi text/data yaitu compile dan matcher, compile digunakan untuk menerima masukan pattern dari regex sedangkan matcher digunakan untuk menerima masukan berupa string yang akan dicocokkan berdasarkan karakteristik regex yang dimasukkan pada method compile.

contoh penggunaan Class Pattern pada java, kode berikut akan digunakan untuk percobaan-percobaan regex pada tulisan ini :
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Sun Microsystems nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

import java.io.Console;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexTestHarness {

public static void main(String[] args){
Console console = System.console();
if (console == null) {
System.err.println("No console.");
System.exit(1);
}
while (true) {

Pattern pattern =
Pattern.compile(console.readLine("%nEnter your regex: "));

Matcher matcher =
pattern.matcher(console.readLine("Enter input string to search: "));

boolean found = false;
while (matcher.find()) {
console.format("I found the text \"%s\" starting at " +
"index %d and ending at index %d.%n",
matcher.group(), matcher.start(), matcher.end());
found = true;
}
if(!found){
console.format("No match found.%n");
}
}
}
}

Setelah compile dan jalankan program untuk melakukan test regex pada posting ini.
amru@bl4ckcub3:~/MyJava/learn/regex$ javac RegexTestHarness.java

jalankan program
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex:


jika program dijalankan akan muncul promt yang meminta kita untuk memasukkan regex. Contoh sederhana dalam menggunakan program adalah untuk mencari kata dalam sebuah kalimat sebagai berikut :
Enter your regex: foo
Enter input string to search: foo bukanlah bar
I found the text "foo" starting at index 0 and ending at index 3.

Enter your regex:


Dari spesifikasi class Pattern dapat rangkum dalam tabel berikut regular expression yang digunakan pada java.

Character Classes
[abc] a, b, atau c (simple class)
[^abc] Semua karakter a, b, atau c (negation)
[a-zA-Z] a sampai z, atau A sampai Z, inclusive (range)
[a-d[m-p]] a sampai d, atau m sampai p: [a-dm-p] (union)
[a-z&&[def]] d, e, atau f (intersection)
[a-z&&[^bc]] a sampai z, kecuali untuk b dan c: [ad-z] (subtraction)
[a-z&&[^m-p]] a sampai z, dan tidak m sampai p: [a-lq-z] (subtraction)


Berikut adalah penjelasan dari table diatas pada applikasinya :
Simple class digunakan untuk melakukan pencocokan satu persatu dari karakter yang ada didalam tandakurung, misal [bcr]at, maka regex tersebut akan cocok dengan pattern berikut "bat", "cat" dan "rat". Dapat dilihat bahwa regex tersebut akan menerima semua urutan karakter dengan awalan karakter "b","c" dan "r" serta diakhiri dengan pattern "at".
ex :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: [bcr]at
Enter input string to search: bat
I found the text "bat" starting at index 0 and ending at index 3.

Enter your regex: [bcr]at
Enter input string to search: cat
I found the text "cat" starting at index 0 and ending at index 3.

Enter your regex: [bcr]at
Enter input string to search: rat
I found the text "rat" starting at index 0 and ending at index 3.

Negation
Digunakan untuk mencocokkan semua karakter kecuali yang ada didalam tandakurung ditandai dengan "^", misal [^bcr]at akan mencari pattern untuk semua karakter kecuali yang diawali dengan karakter "b", "c" dan "r".
ex :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: [^bcr]at
Enter input string to search: bat
No match found.

Enter your regex: [^bcr]at
Enter input string to search: cat
No match found.

Enter your regex: [^bcr]at
Enter input string to search: rat
No match found.

Enter your regex: [^bcr]at
Enter input string to search: hat
I found the text "hat" starting at index 0 and ending at index 3.


Ranges
Untuk menampilkan range pada suatu pattern tertentu ditandai dengan "-". Misal untuk mengenali pattern "a" sampai "c" maka bisa kita gunakan expresi sebagai berikut [a-b].
ex :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: [a-c]
Enter input string to search: a
I found the text "a" starting at index 0 and ending at index 1.

Enter your regex: [a-c]
Enter input string to search: b
I found the text "b" starting at index 0 and ending at index 1.

Enter your regex: [a-c]
Enter input string to search: c
I found the text "c" starting at index 0 and ending at index 1.

Enter your regex: [a-c]
Enter input string to search: d
No match found.

Enter your regex: foo[1-5]
Enter input string to search: foo1
I found the text "foo1" starting at index 0 and ending at index 4.

Enter your regex: foo[1-5]
Enter input string to search: foo5
I found the text "foo5" starting at index 0 and ending at index 4.

Enter your regex: foo[1-5]
Enter input string to search: foo6
No match found.

Enter your regex: foo[^1-5]
Enter input string to search: foo1
No match found.

Enter your regex: foo[^1-5]
Enter input string to search: foo6
I found the text "foo6" starting at index 0 and ending at index 4.

Union
Misalnya kita akan melakukan pengenalan pattern gabungan antara 0 sampai 4 dan 6 sampai 8 bisa kita lakukan dengan cara [0-4[6-8]], maka selain dari union/gabungan range antara 0 sampai 4 dan 6 sampai 8 tidak akan dikenali.
Ex:
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: [0-4[6-8]]
Enter input string to search: 0
I found the text "0" starting at index 0 and ending at index 1.

Enter your regex: [0-4[6-8]]
Enter input string to search: 5
No match found.

Enter your regex: [0-4[6-8]]
Enter input string to search: 6
I found the text "6" starting at index 0 and ending at index 1.

Enter your regex: [0-4[6-8]]
Enter input string to search: 8
I found the text "8" starting at index 0 and ending at index 1.

Enter your regex: [0-4[6-8]]
Enter input string to search: 9
No match found.


Intersection
Digunakan untuk melakukan pengenalan pattern yang berupa irisan atau ingin mengenali suatu pattern pada range tertentu, bisa menggunakan key &&. Misal ingin mengenali pattern 3, 4 dan 5 pada range 0 sampai 9 maka bisa kita kontruksi regex sebagai berikut [0-9&&[345]]
Ex :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: [0-9&&[345]]
Enter input string to search: 3
I found the text "3" starting at index 0 and ending at index 1.

Enter your regex: [0-9&&[345]]
Enter input string to search: 4
I found the text "4" starting at index 0 and ending at index 1.

Enter your regex: [0-9&&[345]]
Enter input string to search: 5
I found the text "5" starting at index 0 and ending at index 1.

Enter your regex: [0-9&&[345]]
Enter input string to search: 2
No match found.

Enter your regex: [0-9&&[345]]
Enter input string to search: 6
No match found.

Enter your regex: [2-8&&[4-6]]
Enter input string to search: 3
No match found.

Enter your regex: [2-8&&[4-6]]
Enter input string to search: 4
I found the text "4" starting at index 0 and ending at index 1.

Enter your regex: [2-8&&[4-6]]
Enter input string to search: 5
I found the text "5" starting at index 0 and ending at index 1.

Enter your regex: [2-8&&[4-6]]
Enter input string to search: 6
I found the text "6" starting at index 0 and ending at index 1.

Enter your regex: [2-8&&[4-6]]
Enter input string to search: 7
No match found.


Substraction
Digunakan untuk melakukan pengenalan pada negasi yang berada pada karakter yang bersarang, misal [0-9&&[^345]] berarti melakukan pencarian pada range 0 sampai 9 kecuali 3, 4 dan 5.

Oke lanjut, setelah kita melakukan percobaan pada class2 karakter ada baiknya jika kita kenali juga predifined charakter class, class Pattern telah mendefinisikan pattern2 diatas sehingga kita bisa memanfaatkannya sebagai shorthands.
Predefined Character Classes
. cocok dengan karakter apapun (may or may not match line terminators)
\d digit: [0-9]
\D non digit: [^0-9]
\s karakter whitespace: [ \t\n\x0B\f\r]
\S karakter non-whitespace: [^\s]
\w karakter kata: [a-zA-Z_0-9]
\W karakter non-word: [^\w]


ex:
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: .
Enter input string to search: @
I found the text "@" starting at index 0 and ending at index 1.

Enter your regex: .
Enter input string to search: 1
I found the text "1" starting at index 0 and ending at index 1.

Enter your regex: .
Enter input string to search: a
I found the text "a" starting at index 0 and ending at index 1.

Enter your regex: \d
Enter input string to search: 1
I found the text "1" starting at index 0 and ending at index 1.

Enter your regex: \d
Enter input string to search: a
No match found.

Enter your regex: \D
Enter input string to search: 1
No match found.

Enter your regex: \D
Enter input string to search: a
I found the text "a" starting at index 0 and ending at index 1.

Enter your regex: \s
Enter input string to search:
I found the text " " starting at index 0 and ending at index 1.

Enter your regex: \s
Enter input string to search: a
No match found.

Enter your regex: \S
Enter input string to search:
No match found.

Enter your regex: \S
Enter input string to search: a
I found the text "a" starting at index 0 and ending at index 1.

Enter your regex: \w
Enter input string to search: a
I found the text "a" starting at index 0 and ending at index 1.

Enter your regex: \w
Enter input string to search: !
No match found.

Enter your regex: \W
Enter input string to search: a
No match found.

Enter your regex: \W
Enter input string to search: !
I found the text "!" starting at index 0 and ending at index 1.


Oke dari predifined class bisa kita simpulkan :
Huruf bukan kapital berarti :
\d cocok untuk semua digit
\s cocok untuk whitespace
\w cocok untuk semua karakter penyusun kata

Sedangkan hurus kapital :

\D cocok untuk non-digits
\S cocok untuk non-spaces
\W cocok untuk semua non karakter penyusun kata

Quantifiers
Dengan menggunakan quantifiers kita bisa melakukan pencocokan berdasarkan berapa kali kita akan melakukan pengenalan pattern pada suatu urutan karakter, spesifikasi class Pattern mempunyai 3 quantifiers yaitu greedy, Reluctant dan Possessive. Berikut adalah tabel quantifiers :

Quantifiers
Meaning
Greedy Reluctant Possessive
X? X?? X?+ X, once or not at all
X* X*? X*+ X, zero or more times
X+ X+? X++ X, one or more times
X{n} X{n}? X{n}+ X, exactly n times
X{n,} X{n,}? X{n,}+ X, at least n times
X{n,m} X{n,m}? X{n,m}+ X, at least n but not more than m times


Sekarang kita akan melakukan percobaan dengan quantifiers greedy menggunakan huruf "a" dengan diikuti ?, *, + kita akan lihat perbedaannya. Input yang digunakan adalah string kosong "".
ex :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: a?
Enter input string to search:
I found the text "" starting at index 0 and ending at index 0.

Enter your regex: a*
Enter input string to search:
I found the text "" starting at index 0 and ending at index 0.

Enter your regex: a+
Enter input string to search:
No match found.


Pada contoh diatas untuk a? dan a* akan mengijinkan adanya pattern "", karena pattern "" ada pada input string kosong, awal dari input string, akhir dari input string atau diantara huruf pada input string.

kita lakukan percobaan lagi untuk melihat perbedaan dari ketiganya dengan memberikan input masukan berupa karakter "a":
ex :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: a?
Enter input string to search: a
I found the text "a" starting at index 0 and ending at index 1.
I found the text "" starting at index 1 and ending at index 1.

Enter your regex: a*
Enter input string to search: a
I found the text "a" starting at index 0 and ending at index 1.
I found the text "" starting at index 1 and ending at index 1.

Enter your regex: a+
Enter input string to search: a
I found the text "a" starting at index 0 and ending at index 1.


dari hasil diatas dapat kita lihat bahwa pada a? dan a* tetap menemukan pattern "" pada akhir karakter, karena pada index 0 ditempati oleh karakter "a" sedang pattern "" akan dikenali pada index ke 1 dan diakhiri pada index 1 juga.

oke sekarang kita coba lagi bagaimana jika masukannya berupa string "aaaaa" ?
ex :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: a?
Enter input string to search: aaaaa
I found the text "a" starting at index 0 and ending at index 1.
I found the text "a" starting at index 1 and ending at index 2.
I found the text "a" starting at index 2 and ending at index 3.
I found the text "a" starting at index 3 and ending at index 4.
I found the text "a" starting at index 4 and ending at index 5.
I found the text "" starting at index 5 and ending at index 5.

Enter your regex: a*
Enter input string to search: aaaaa
I found the text "aaaaa" starting at index 0 and ending at index 5.
I found the text "" starting at index 5 and ending at index 5.

Enter your regex: a+
Enter input string to search: aaaaa
I found the text "aaaaa" starting at index 0 and ending at index 5.

Nah sekarang dah katahuan kan bedanya huehuehue ..., tapi kita akan coba sekali lagi untuk memastikannya dengan mengubah string masukan menjadi "ababaaaab".
ex :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: a?
Enter input string to search: ababaaaab
I found the text "a" starting at index 0 and ending at index 1.
I found the text "" starting at index 1 and ending at index 1.
I found the text "a" starting at index 2 and ending at index 3.
I found the text "" starting at index 3 and ending at index 3.
I found the text "a" starting at index 4 and ending at index 5.
I found the text "a" starting at index 5 and ending at index 6.
I found the text "a" starting at index 6 and ending at index 7.
I found the text "a" starting at index 7 and ending at index 8.
I found the text "" starting at index 8 and ending at index 8.
I found the text "" starting at index 9 and ending at index 9.

Enter your regex: a*
Enter input string to search: ababaaaab
I found the text "a" starting at index 0 and ending at index 1.
I found the text "" starting at index 1 and ending at index 1.
I found the text "a" starting at index 2 and ending at index 3.
I found the text "" starting at index 3 and ending at index 3.
I found the text "aaaa" starting at index 4 and ending at index 8.
I found the text "" starting at index 8 and ending at index 8.
I found the text "" starting at index 9 and ending at index 9.

Enter your regex: a+
Enter input string to search: ababaaaab
I found the text "a" starting at index 0 and ending at index 1.
I found the text "a" starting at index 2 and ending at index 3.
I found the text "aaaa" starting at index 4 and ending at index 8.


oke jadi kesimpulannya begini untuk a? akan melakukan pencocokan karakter satu persatu dan akan menggantikan pattern yang tidak cocok dengan ""(string kosong), a* akan melakukan pencocokan karakter yang sama dengan a tetapi tidak satu persatu karakter tapi jika ada pattern yang sama misalnya "aaaa" akan dianggap sebagai sebuah kesatuan dan aka mengganti pattern yang tidak sama dengan "" dan pada a+ bertindak seperti a* tetapi langsung mengabaikan pattern yang tidak cocok.

lalu bagaimana jika kita ingin mencocokkan pattern karakter dengan jumlah tertentu ??, the answer is use the curly braces {n} oke!!
ex :
Enter your regex: a{3}
Enter input string to search: aa
No match found.

Enter your regex: a{3}
Enter input string to search: aaa
I found the text "aaa" starting at index 0 and ending at index 3.

Enter your regex: a{3}
Enter input string to search: aaaa
I found the text "aaa" starting at index 0 and ending at index 3.


dari contoh diatas dapat dilihat pemanfaatan dari {n}, n adalah jumlah karakter yang akan dicocokkan.Tapi kenapa yang pertama gagal ?? itu karena string yang dicocokkan jumlahnya lebih sedikit jika dibadingkan dengan jumlah regex yang akan dikenali meskipun string inputnya sama yaitu "aa". Nah kita lanjut lagi masih seputar {n}, lets look bellow :
Ex :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: a{3}
Enter input string to search: aaaaaaaaa
I found the text "aaa" starting at index 0 and ending at index 3.
I found the text "aaa" starting at index 3 and ending at index 6.
I found the text "aaa" starting at index 6 and ending at index 9.

Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.

Enter your regex: a{3,6}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaa" starting at index 0 and ending at index 6.
I found the text "aaa" starting at index 6 and ending at index 9.


oke penjelasan untuk output diatas adalah sebagai berikut, untuk yang pertama dengan a{3} akan mengenali 3 kali karena input string "aaaaaaaaa" sejumlah 3 kali pattern a{3}, untuk yang kedua dengan {3,} maksudnya akan mengenali pattern minimal dengan panjang karakter "aaa" dengan pangjang maksimal tak terbatas, untuk yang terakhir dengan {3,6} sebenarnya sama dengan yang kedua hanya bedanya ada batas pengenalan panjang pattern yaitu sepanjang 6 karakter.

Sekarang perbadaan antara regex (dog){3} dengan dog{3} ??, look bellow agains ...
Ex :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: (dog){3}
Enter input string to search: dogdogdogdogdogdog
I found the text "dogdogdog" starting at index 0 and ending at index 9.
I found the text "dogdogdog" starting at index 9 and ending at index 18.

Enter your regex: dog{3}
Enter input string to search: dogdogdogdogdogdog
No match found.

terlihat bahwa yang pertama akan mengenali pattern berupa group karakter yaitu "dog" dengan panjang 3, sedangkan yang kedua hanya akan mengenali "dog" dimana yang dihitung jumlahnya bukan "dog" tetapi karakter "g". Untuk melakukan grouping seperti (dog){3} tetapi tidak mementingkan urutan bisa kita gunakan pattern [x]{n}, contoh :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: [abc]{3}
Enter input string to search: abccabaaaccbbbc
I found the text "abc" starting at index 0 and ending at index 3.
I found the text "cab" starting at index 3 and ending at index 6.
I found the text "aaa" starting at index 6 and ending at index 9.
I found the text "ccb" starting at index 9 and ending at index 12.
I found the text "bbc" starting at index 12 and ending at index 15.


Perbedaan antara greedy, reluctant dan possessive ??, okeh kita lihat saja contoh berikut ini :
amru@bl4ckcub3:~/MyJava/learn/regex$ java RegexTestHarness

Enter your regex: .*foo // greedy quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.

Enter your regex: .*?foo // reluctant quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfoo" starting at index 0 and ending at index 4.
I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.

Enter your regex: .*+foo // possessive quantifier
Enter input string to search: xfooxxxxxxfoo
No match found.

proses pada gredy adalah pertama dia akan mengkonsumsi semua input dengan menggunakan (.*) termasuk pattern "foo" yang terakhir, perlu diingat pencocokan pada gredy dimulai dari belakang sampai diketemukan pattern "foo" yang terakhir. Itulah kenapa setelah diketemukan pattern "foo" yang terakhir pencocokan akan berhenti.
proses pada reluctant adalah pertama dia tidak akan mengkonsumsi apapun dari input, pencocokannya akan dilakukan dari depan dengan mencocokkan satu persatu sampai diketemukan pattern "foo", jika diketemukan maka akan menghentikan pencocokan dan memulai kembali pencocokan dari index dimana dia berhenti.
proses pada possessive sama dengan greedy tetapi dia tidak akan mengulang lagi jika tidak diketemukan, pencocokan hanya dilakukan sekali saja.

reference : http://java.sun.com/docs/books/tutorial

Monday, December 15, 2008

Mengenal Tipe Enum



Definisi : Tipe enum merupakan tipe yang terdiri dari sekumpulan field constan. Misalkan bisa saja digunakan untuk mendefinisikan empat arah mata angin (NORTH, SOUTH, EAST, dan WEST) atau bisa jug digunakan untuk menyimpan nilai hari-hari dalam seminggu.

Note : enum sendiri mulai ada pada Java 1.5


pada java kita bisa menggunakan keyword enum untuk mendefinisikan tipe enum, contoh pada kode berikut :

/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Sun Microsystems nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}


Kapan enum cocok untuk digunakan ?, ketika kita ingin merepresentasikan set konstanta yang tetap. Misalkan saja kita ingin merepresentasikan data set planet yang ada pada susunan tatasurya kita (ya kalo ngga ditemukan planet baru hehehe...).

Kode program di bawah ini merupakan contoh penggunaan tipe enum Day yang telah kita buat sebelumnya.

/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Sun Microsystems nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

public class EnumTest {
Day day;

public EnumTest(Day day) {
this.day = day;
}

public void tellItLikeItIs() {
switch (day) {
case MONDAY: System.out.println("Mondays are bad.");
break;

case FRIDAY: System.out.println("Fridays are better.");
break;

case SATURDAY:
case SUNDAY: System.out.println("Weekends are best.");
break;

default: System.out.println("Midweek days are so-so.");
break;
}
}

public static void main(String[] args) {
EnumTest firstDay = new EnumTest(Day.MONDAY);
firstDay.tellItLikeItIs();
EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
thirdDay.tellItLikeItIs();
EnumTest fifthDay = new EnumTest(Day.FRIDAY);
fifthDay.tellItLikeItIs();
EnumTest sixthDay = new EnumTest(Day.SATURDAY);
sixthDay.tellItLikeItIs();
EnumTest seventhDay = new EnumTest(Day.SUNDAY);
seventhDay.tellItLikeItIs();


}
}


Output program :
Mondays are bad.
Midweek days are so-so.
Fridays are better.
Weekends are best.
Weekends are best.


Tipe enum tidak hanya bisa menyimpan konstanta saja, tetapi juga bisa mempunyai konstruktor dan juga field2 inilah yang membuat tipe enum menjadi powerfull. Untuk melakukan iterasi pada tipe enum kita bisa memanfaatkan for-each loop pada java :

for (Planet p : Planet.values()) {
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}


Note : ketika kita mendefinisikan tipe enum secara otomatis akan menurunkan class java.lang.Enum. Karena java tidak mengijinkan multiple inheritance sehingga tipe enum tidak bisa menurunkan/extends dari class lain.


Tipe enum dapat mempunyai parameter, yang akan dilewatkan pada konstruktornya ketika konstruktor dipanggil. Berikut adalah contoh kode enum yang merepresentasikan planet dalam susunan tatasurya kita, yang outputnya akan menghitung bobot kita di planet2 yang lain.

* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Sun Microsystems nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7);

private final double mass; // in kilograms
private final double radius; // in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
private double mass() { return mass; }
private double radius() { return radius; }

// universal gravitational constant (m3 kg-1 s-2)
public static final double G = 6.67300E-11;

double surfaceGravity() {
return G * mass / (radius * radius);
}
double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
public static void main(String[] args) {
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight/EARTH.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
}


Output program (dimana program menerima parameter masukan berupa bobot kita) :
$ java Planet 175
Your weight on MERCURY is 66.107583
Your weight on VENUS is 158.374842
Your weight on EARTH is 175.000000
Your weight on MARS is 66.279007
Your weight on JUPITER is 442.847567
Your weight on SATURN is 186.552719
Your weight on URANUS is 158.397260
Your weight on NEPTUNE is 199.207413


referensi :
http://java.sun.com/docs/books/tutorial

Thinking .... ???



Image from : http://www.suzannesutton.com/_borders/boy_desk_thinking.jpg

(Yaitu) orang-orang yang mengingat Allah sambil berdiri atau duduk atau dalam keadaan berbaring dan mereka memikirkan tentang penciptaan langit dan bumi (seraya berkata):
Ya Tuhan kami, tiadalah Engkau menciptakan ini dengan sia-sia. Maha Suci Engkau, maka perihalah kami dari siksa neraka.
(Ali Imron, 3:191)


Pernahkah kita memikirkan bahwa kita tidak ada sebelum dilahirkan ke dunia; dan kita telah diciptakan dari sebuah ketiadaan ?

Pernahkah kita berfikir bagaimana bunga yang setiap hari kita lihat, yang tumbuh dari tanah yang hitam, ternyata memiliki bau yang harum serta berwarna-warni?

Pernahkah kita memikirkan seekor nyamuk, yang sangat mengganggu ketika terbang mengitari kita, mengepakkan sayapnya dengan kecepatan yang sedemikian tinggi sehingga kita tidak mampu melihatnya ?

Pernahkah kita berpikir bahwa gempa bumi mungkin saja datang secara tiba-tiba ketika anda sedang tidur, yang menghancur luluhkan rumah, kantor dan kota hingga rata dengan tanah sehingga dalam tempo beberapa detik saja kita pun kehilangan segala sesuatu yang kita miliki di dunia ini ?

Pernahkah kita berfikir bahwa kehidupan kita berlalu dengan sangat cepat, kita pun menjadi semakin tua dan lemah, dan lambat laun kehilangan ketampanan atau kecantikan, kesehatan dan kekuatan kita ?

Pernahkah kita memikirkan bahwa suatu hari nanti, malaikat maut yang diutus oleh Allah akan menjemput untuk membawa kita meninggalkan dunia ini ?

Jika demikian, pernahkah kita berfikir mengapa manusia demikian terbelenggu oleh kehidupan dunia yang sebentar akan kita tinggalkan dan yang seharusya kita jadikan sebagai tempat untuk bekerja keras dalam meraih kebahagiaan hidup di akhirat ?


From---Bagaimana Seorang Muslim Berfikir---Harun Yahya Series---

Wednesday, December 10, 2008

Koneksi Sang Gajah dengan Sang Kopi pada Pinguin




Dari judulnya koneksi Sang Gadjah dengan Sang Kopi apa yang akan terlintas dalam pikiran kita, gimana ya caranya ??? trus ngapain juga ngurusin gajah sama kopi ??? kok ada pinguin juga sih???. Kalo kita bisa melakukannya akan sangat menyenangkan dan akan memberikan hasil yang sangat powerfull... tau sendiri kan tenaga gajah yang kuat didukung bentuknya yang gede ditambah dengan nikmatnya rasa kopi yang nikmat pluss-pluss kemampuan pinguin dalam bermigrasi pada jarak yang sangat jauh. Jadinya pinguin gendong gajah yang kuat dan ngga ngantuk-an hehe... so powerfull..

Oke langsung saja yah disini kita mau mengkoneksikan PosgreSQL dengan Java. Truss hubungannnya apa sama gajah, kopi ma pinguin ??? ya secara gituloh logonya Postgre kan gajah trademarknya Java kan make logo Secangkir kopi dan tau sendiri logonya sang jawara kita Linux kan pinguin... jadinya ya ngga pa kan klo dianalogikan sabagai gajah, kopi dan pinguin...

Yuuk lanjut...

JDBC Driver untuk postgreSQL dapat didownload dari http://jdbc.postgresql.org/.
Jangan lupa download drivernya dan sesuaikan dengan versi JDK yang digunakan, atau bisa dibuild sendiri menggunakan ant, untuk mem-build dibutuhkan ant versi 1.5 atau versi yang lebih tinggi. Ant sendiri merupakan tool untuk building Java-based package, ant tool dapat diperoleh melalui http://ant.apache.org/index.html.

Installasi Ant
Setelah didownload tinggal diekstrak tanpa ada kompilasi ulang karena merupakan program java tinggal dijalankan saja. Lalu bagaimana cara menggunakannya ???, Ant didesain agar mudah digunakan. Direktori /bin berisi file executable bernama ant yang digunakan untuk menjalankan ant. Kita dapat menjalankan ant dengan cara memanggilnya dengan cara ./ant atau $ANT_HOME/bin/ant atau /ant_direktori/bin/ant. Secara default ant akan menggunakan dimana ant berada dan akan mencoba untuk mencari file build.xml. Berikut ini adalah contoh untuk file build.xml yang bisa digunakan untuk build driver :




Jika driver dibuild dari source akan menghasilkan file dengan format postgresql-[server version].[buildnumber].jdbc[JDBC version].jar, sebagai contoh postgresql-8.0-310.jdbc3.jar. Jangan lupa untuk menambahkannya kedalam classpath. Sebagai berikut :

pada unix/linux => export CLASSPATH=/direktori_tempat_driver/nama_driver.jar


Karena Java tidak mensupport menggunakan unix socket jadi PostgreSQL harus dikonfigurasi terlebih dahulu agar bisa menerima koneksi dari TCP/IP. Untuk Postgre versi 8.0 mengijinkan koneksi dari localhost. Agar koneksi dari luar localhost diijinkan maka perlu memodifikasi file postgresql.conf pada bagian listen_addresses setting.

untuk server versi 8.0 jangan lupa untuk set tcpip_socket = true di file postgresql.conf, dalam pembuatan artikel ini ane menggunakan versi 8.3 tanpa modifikasi pada file postgresql.conf sedikitpun dan secara default TCP/IP dan listen_address setting sudah default mendengarkan localhost.

Note : Proses instalasi PostgreSQL bisa dilihat di http://postgresql.org, ada dua jenis instalasi bisa dari source maupun binari. Keduanya sama2 enak kok... easy to learn lah pokoknya.


Lanjut lagi yuuk..

Asumsi Postgre sudah terinstall dan bisa berjalan dengan baik. Buat user baru dengan nama "learn" dan passwordnya "learn", Pada instalasi Postgre secara default akan mempunyai user postgres sebagai superuser, melalui user ini kita bisa membuat user baru dan database baru.

Masuk menggunakan user postgres, sbb :

amru@blackcube:/opt/PostgreSQL/8.3/bin$ ./psql -U postgres -W
Password for user postgres:
Welcome to psql 8.3.4, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

postgres=#


Buat user baru "learn" menggunakan pasword "learn" :

postgres=# CREATE USER learn WITH PASSWORD 'learn';
CREATE ROLE
postgres=#


Buat database baru "learn" sebagai percobaan :

postgres=# CREATE DATABASE learn;
CREATE DATABASE
postgres=#


Keluar dari user postgres dan login sebagai user learn untuk memastikan bahwa user bisa login dan menggunakan database learn :

postgres=# \q
amru@blackcube:/opt/PostgreSQL/8.3/bin$
amru@blackcube:/opt/PostgreSQL/8.3/bin$ ./psql -U learn -d learn -W
Password for user learn:
Welcome to psql 8.3.4, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

learn=>


Oke setelah user bisa login dan bisa menggunakan database learn, selanjutnya kita coba untuk langsung mencoba menggunakan JDBC. Yuuuk!!!

Importing JDBC
Setiap source yang menggunakan JDBC harus melakukan import pada paket java.sql, sbb:

import java.sql.*;


Loading The Driver

Sebelum melakukan koneksi ke database, kita harus load driver terlebih dahulu. Ada dua cara untuk load driver, terserah mau pake yang mana tergantung selera dalam coding antum2 sekalian.
Metode yang pertama, secara implisit kita load driver menggunakan method Class.forName(). untuk PostgreSQL :

Class.forName("org.postgresql.Driver");


Metod diatas akan melakukan load pada driver, dan ketika loading, driver secara otomatis akan melakukan register dengan JDBC. Metod forName() akan menghasilkan ClassNotFoundException jika driver tidak diketemukan.
Metode loading yang kedua dengan cara melewatkan driver sebagai parameter ke JVM pada waktu akan menjalankan program, dengan menggunakan -D argument. Contoh :

java -Djdbc.drivers=org.postgresql.Driver contoh.ProgramJDBC


dengan metode melewatkan parameter diatas kita bisa mengubah driver tanpa harus melakukan komilasi ulang tinggal mengubah nama driver yang dilewatkan pada saat runtime.

Ketika kita mencoba untuk melakukan koneksi dan tiba2 terjadi kesalahan misalnya, driver tidak diketemukan SQLException akan muncul, ini dimungkinkan karena driver tidak berada pada classpath, atau nilai yang dilewatkan pada parameter tidak tepat.

Connecting to the Database

Dengan menggunakan JDBC, database direpresentasikan dengan menggunakan URL(Uniform Resource Locator). Untuk PostgreSQL URL akan didapatkan sbb :

-jdbc:postgresql:database
-jdbc:postgresql://host/database
-jdbc:postgresql://host:port/database


Oke setelah itu kita masuk ke koding ya!!!
Pada contoh dibawah ini kita akan melakukan koneksi ke database kemudian akan membuat temporary table geomtest, selanjutnya akan melakukan insert kedalam table tersebut.. dan kita tampilkan isi dari table tersebut.

//Import JDBC
import java.sql.*;

//Import tipe data PGpoint dan PGcircle, akan kita
import org.postgresql.geometric.PGpoint;
import org.postgresql.geometric.PGcircle;

public class GeometricTest {

public static void main(String args[]) throws Exception {
//load driver
Class.forName("org.postgresql.Driver");
//learn pada url merupakan nama database
String url = "jdbc:postgresql://localhost:5432/learn";
//melakukan koneksi ke databse menggunakan Class Connection, dengan parameter sbb :
//url merupakan url database
//learn yang pertama merupakan username
//learn yang kedua merupakan password
Connection conn = DriverManager.getConnection(url, "learn", "learn");

//Class statement digunakan untuk memasukkan tag DML, DDL
Statement stmt = conn.createStatement();
stmt.execute("CREATE TEMP TABLE geomtest(mycirc circle)");
stmt.close();

insertCircle(conn);
retrieveCircle(conn);
conn.close();
}

//metod digunakan untuk melakukan insert kedalam table
private static void insertCircle(Connection conn) throws SQLException {

PGpoint center = new PGpoint(1, 2.5);
double radius = 4;
PGcircle circle = new PGcircle(center, radius);

//PreparedStatement digunakan untuk melakukan perubahan pada statemen sebelumnya
//atau kita bisa membuat statement baru dengan menggunakan conn.createStatement()
PreparedStatement ps = conn
.prepareStatement("INSERT INTO geomtest(mycirc) VALUES (?)");
ps.setObject(1, circle);
ps.executeUpdate();
ps.close();
}

private static void retrieveCircle(Connection conn) throws SQLException {
Statement stmt = conn.createStatement();
ResultSet rs = stmt
.executeQuery("SELECT mycirc, area(mycirc) FROM geomtest");
rs.next();
PGcircle circle = (PGcircle) rs.getObject(1);
double area = rs.getDouble(2);

PGpoint center = circle.center;
double radius = circle.radius;

System.out.println("Center (X, Y) = (" + center.x + ", " + center.y
+ ")");
System.out.println("Radius = " + radius);
System.out.println("Area = " + area);
}
}


Kemudian compile program dengan cara :

amru@blackcube:~/MyJava$ javac -classpath /media/sda7/Java/JDBC/postgresql-8.3-604.jdbc4.jar GeometricTest.java
amru@blackcube:~/MyJava$


Jalankan program dengan cara :

amru@blackcube:~/MyJava$ java GeometricTest
Center (X, Y) = (1.0, 2.5)
Radius = 4.0
Area = 50.26548245743669


Kelar dah...

Untuk download resource dan dokumentasi kunjungin aja situsnya..
Referensi :
http://jdbc.postgresql.org/
http://ant.apache.org/index.html

Saturday, December 6, 2008

Mengenal Annotation pada Java Programing



Assalamu'alaikum... dah lama ternyata ngga ngpost di blog kesayanganku ini, dari pada ngga posting2 mending ngeshare ilmu aja deh... ini tentang Annotation tapi bukan tentang annots yang ini.
Pengennya mau gesend artikelnya ke ilmukomputer.com, tapi ngga tau kok tiba2 usernya ngga bisa kepake, hilang kali ya gara2 dihack kemaren.

yowislah langsung aja..

Annotation merupakan informasi data tentang kode program tetapi tidak akan berdampak secara langsung pada kode, atau lebih dikenal dengan nama meta tag.
Lalu apa kegunaan dari annotation ?
1.Memberikan informasi kepada compiler - Annotation dapat digunakan oleh compiler untuk mendeteksi error atau suppress warning.
2.Compiler-time dan deployment-time processing - Software tools dapat memproses informasi dari annotation untuk men-generate code, XML file, dan masih banyak lagi.
3.Runtime processing - Beberapa annotation akan diperiksa pada waktu runtime.

Annotation dapat diaplikasikan pada class, field, method, dan elemen program yang lain.

Annotation sering berdiri sendiri,dan mempunyai elemen baik dengan nama ataupun tidak :

@Author(
name = "Benjamin Franklin",
date = "3/27/2003"
)
class MyClass() { }

atau

@SuppressWarnings(value="unchecked")
void myMethod() { }


Jika hanya ada satu elemen saja bernama "value," maka nama dapat dihilangkan, sbb :

@SuppressWarnings("unchecked")
void myMethod() { }

Begitu juga jika annotation tidak mempunyai elemen, tanda kurung dapat dihilangkan, sbb :

@Override
void myMethod() { }

Documentation
Annotation sering digunakan untuk menggantikan komentar pada program.
Pada program biasanya menambahkan komentar pada program untuk memberikan informasi2 yang penting, sbb :

public class Generation3List extends Generation2List {

// Author: John Doe
// Date: 3/17/2002
// Current revision: 6
// Last modified: 4/12/2004
// By: Jane Doe
// Reviewers: Alice, Bill, Cindy

// class code goes here

}


Untuk menambahkan dengan annotation seperti pada komentar pada class Generation3List diatas, kita harus mendefinisikan tipe annotation. Sintaknya sebagai berikut :

@interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
String lastModified() default "N/A";
String lastModifiedBy() default "N/A";
String[] reviewers(); // Note use of array
}


jika dilihat sekilas pendefinisian tipe annotation mirip dengan pendefinisian interface, bedanya pada tipe annotation didahului dengan karakter @ (@ = "AT" sebagai tipe Annotation) dan bisa diberi nilai default.

Kemudian kita bisa mendefinisikan tipe annotation pada class Generation3List, sbb :

@ClassPreamble (
author = "John Doe",
date = "3/17/2002",
currentRevision = 6,
lastModified = "4/12/2004",
lastModifiedBy = "Jane Doe"
reviewers = {"Alice", "Bob", "Cindy"} // Note array notation
)
public class Generation3List extends Generation2List {

// class code goes here

}


Catatan : Untuk membuat informasi2 pada ClassPreamble muncul pada saat pembuatan javadoc, kita harus mendefinisikan annotasi @Documented, sbb:

import java.lang.annotation.*; // import this to use @Documented

@Documented
@interface ClassPreamble {

// Annotation element definitions

}


Annotation digunakan oleh compiler
Ada tiga tipe annotation yang secara automatis akan didefinisikan : @Deprecated, @Override, dan @SuppressWarnings.
@Deprecated -- Digunakan untuk menandai bahwa elemen yang ditandai sudah tidak digunakan lagi, mungkin karena suatu alasan dari developer. Kita menggunakan tag @deprecated untuk mendocumentasikannya, sbb :

// Javadoc comment follows
/**
* @deprecated
* explanation of why it was deprecated
*/
@Deprecated
static void deprecatedMethod() { }
}


@Override -- Digunakan untuk menandai bahwa method merupakan method yang di-override dari supperclass atau interface.

// mark method as a superclass method
// that has been overridden
@Override
int overriddenMethod() { }


compiler akan menampilkan kesalahan jika terjadi kesalahan pada waktu melakukan overriden.

@SuppressWarnings -- Digunakan untuk tidak memunculkan pesan peringatan, misalnya kita menggunakan method yang telah deprecated, kita bisa menggunakan annotation ini untuk menghilangkan pesan peringatan bahwa method yang kita pakai adalah deprecated :

// use a deprecated method and tell
// compiler not to generate a warning
@SuppressWarnings("deprecation")
void useDeprecatedMethod() {
objectOne.deprecatedMethod(); //deprecation warning - suppressed
}



agar annotation bisa dilihat saat runtime, maka gunakan @Retention(RetentionPolicy.RUNTIME), sbb:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationForRuntime {

// Elements that give information
// for runtime processing

}