12
Enumerasi,
Autoboxing, dan Annotasi
Bab
ini akan menyajikan tiga fitur pada Java: enumerasi, autoboxing, dan annotasi
(yang juga dikenal dengan metadata).
Soal dan Penyelesaian
1.
Tulis dan ujilah sebuah program yang menggunakan enumerasi.
Penyelesaian
// Sebuah enumerasi yang memuat beberapa varietas apel.
enum Apple {
Jonathan, GoldenDel, RedDel,
Winesap, Cortland
}
class DemoEnumerasi {
public static void main(String args[]) {
Apple ap;
ap = Apple.RedDel;
// Menampilkan nilai enum.
System.out.println("Nilai dari ap: " + ap);
System.out.println();
ap = Apple.GoldenDel;
// Membandingkan dua nilai
enum.
if(ap == Apple.GoldenDel)
System.out.println("ap
memuat GoldenDel.\n");
// menggunakan enum untuk
mengendalikan statemen switch.
switch(ap) {
case Jonathan:
System.out.println("Jonathan
berwarna merah.");
break;
case GoldenDel:
System.out.println("Golden
Delicious berwarna kuning.");
break;
case RedDel:
System.out.println("Red
Delicious berwarna merah.");
break;
case Winesap:
System.out.println("Winesap
berwarna merah.");
break;
case Cortland:
System.out.println("Cortland
berwarna merah.");
break;
}
}
}
Keluaran Program
Nilai dari ap: RedDel
ap memuat GoldenDel.
Golden Delicious berwarna kuning.
2.
Tulislah sebuah program yang mendemonstrasikan metode values dan valueOf.
Penyelesaian
// Menggunakan dua metode built-in.
// Sebuah enumerasi yang memuat beberapa varietas apel.
enum Apple {
Jonathan, GoldenDel, RedDel,
Winesap, Cortland
}
public class
DemoValuesdanValueOf {
public static void main(String args[]) {
Apple ap;
System.out.println("Berikut adalah semua konstanta Apple:
");
// menggunakan values()
Apple semuaApel[] =
Apple.values();
for(Apple a : semuaApel)
System.out.println(a);
System.out.println();
// menggunakan valueOf()
ap = Apple.valueOf("Winesap");
System.out.println("ap memuat " + ap);
}
}
Keluaran Program
Berikut adalah semua konstanta Apple:
Jonathan
GoldenDel
RedDel
Winesap
Cortland
ap memuat Winesap
3.
Enumerasi Java adalah tipe kelas. Meskipun Anda tidak menginstansiasi enum
menggunakan new, ia memiliki kapabilitas yang hampir sama dengan kelas. Dengan
enumerasi, Anda dapat memberikan konstruktor, menambahkan variabel dan metode
instans, dan bahkan mengimplementasikan antarmuka.
Adalah penting untuk memahami bahwa
tiap konstanta enumerasi merupakan sebuah objek dari tipe enumerasinya. Jadi,
ketika Anda mendefinisikan konstruktor untuk sebuah enum, konstruktor tersebut
dipanggil ketika konstanta enumerasi diciptakan. Selain itu, tiap konstanta
enumerasi memiliki salinan variabel sendiri yang didefinisikan oleh enumerasi.
Tulislah sebuah program untuk
mengilustrasikan situasi ini.
Penyelesaian
// Menggunakan konstruktor, variabel dan metode instans pada enumerasi.
enum Apple {
Jonathan(10000),
GoldenDel(9000), RedDel(12000), Winesap(15000),
Cortland(8000);
private int harga; //
harga tiap apel
// Konstruktor
Apple(int p) { harga = p; }
int getPrice() { return
harga; }
}
public class
DemoEnumerasi2 {
public static void main(String args[]) {
Apple ap;
// Menampilkan harga
Winesap.
System.out.println("Winesap seharga " +
Apple.Winesap.getPrice()
+
" rupiah.\n");
// Menampilkan semua apel dan harganya.
System.out.println("Semua harga apel:");
for(Apple a : Apple.values())
System.out.println(a +
" seharga " + a.getPrice()
+
" rupiah.");
}
}
Keluaran Program
Winesap seharga
15000 rupiah.
Semua harga apel:
Jonathan seharga 10000 rupiah.
GoldenDel seharga 9000 rupiah.
RedDel seharga 12000 rupiah.
Winesap seharga 15000 rupiah.
Cortland seharga 8000 rupiah.
4.
Tulislah sebuah program yang mendemonstrasikan penggunaan metode ordinal, compareTo, dan equals.
Penyelesaian
// Demonstrasi ordinal(), compareTo(), dan equals().
// Sebuah enumerasi dengan beberapa varietas apel.
enum Apple {
Jonathan, GoldenDel, RedDel,
Winesap, Cortland
}
public class
DemoEnumerasi3 {
public static void main(String args[]) {
Apple ap, ap2, ap3;
// mendapatkan semua nilai
ordinal menggunakan ordinal().
System.out.println("Berikut adalah semua konstanta apel"
+
" dan nilai-nilai ordinalnya: ");
for(Apple a : Apple.values())
System.out.println(a +
" " + a.ordinal());
ap = Apple.RedDel;
ap2 = Apple.GoldenDel;
ap3 = Apple.RedDel;
System.out.println();
// mendemonstrasikan compareTo()
dan equals()
if(ap.compareTo(ap2) < 0)
System.out.println(ap +
" ada sebelum " + ap2);
if(ap.compareTo(ap2) > 0)
System.out.println(ap2 +
" ada sebelum " + ap);
if(ap.compareTo(ap3) == 0)
System.out.println(ap + " sama dengan " + ap3);
System.out.println();
if(ap.equals(ap2))
System.out.println("Error!");
if(ap.equals(ap3))
System.out.println(ap +
" sama dengan " + ap3);
if(ap == ap3)
System.out.println(ap +
" == " + ap3);
}
}
Keluaran Program
Berikut adalah semua konstanta apel dan nilai-nilai
ordinalnya:
Jonathan 0
GoldenDel 1
RedDel 2
Winesap 3
Cortland 4
GoldenDel ada sebelum RedDel
RedDel sama dengan RedDel
RedDel sama dengan RedDel
RedDel == RedDel
5.
Tulislah satu lagi contoh penggunaan enumerasi.
Penyelesaian
import java.util.Random;
// Sebuah enumerasi dengan beberapa kemungkinan jawaban.
enum Jawaban {
TIDAK, YA, MUNGKIN, NANTI,
MALAS, TDK_MAU
}
class Pertanyaan {
Random rand = new Random();
Jawaban tanya() {
int prob = (int) (100 *
rand.nextDouble());
if (prob < 15)
return Jawaban.MUNGKIN; // 15%
else if (prob < 30)
return Jawaban.TIDAK; // 15%
else if (prob < 60)
return Jawaban.YA; // 30%
else if (prob < 75)
return Jawaban.NANTI; // 15%
else if (prob < 98)
return Jawaban.MALAS; // 13%
else
return Jawaban.TDK_MAU; // 2%
}
}
class TanyaSaya {
static void
jawab(Jawaban hasil) {
switch(hasil) {
case TIDAK:
System.out.println("Tidak");
break;
case YA:
System.out.println("Ya");
break;
case MUNGKIN:
System.out.println("Mungkin");
break;
case NANTI:
System.out.println("Nanti");
break;
case MALAS:
System.out.println("Malas");
break;
case TDK_MAU:
System.out.println("Tidak
mau");
break;
}
}
public static void main(String args[]) {
Pertanyaan q = new Pertanyaan();
jawab(q.tanya());
jawab(q.tanya());
jawab(q.tanya());
jawab(q.tanya());
}
}
Keluaran Program
Ya
Tidak
Nanti
Ya
6.
Tipe wrapper pada Java adalah Double,
Float, Long, Integer, Short, Byte, Character, dan Boolean. Tulislah sebuah program yang
menggunakan tipe wrapper ini.
Penyelesaian
// Demonstrate a type wrapper.
public class
DemoTipeWrapper {
public static void main(String args[]) {
Integer iOb = new Integer(100);
int i = iOb.intValue();
System.out.println(i +
" " + iOb); // menampilkan 100 100
}
}
Keluaran Program
100 100
7.
Autoboxing merupakan proses dimana sebuah tipe primitif secara otomatis
dienkapsulasi menjadi tipe wrapper ekivalennya. Auto-unboxing merupakan proses
dimana nilai dari sebuah objek yang dienkapsulasi secara otomatis diekstrak
dari tipe wrapper. Tulislah sebuah program sederhana untuk mengilustrasi
situasi ini.
Penyelesaian
// Demonstrasi autoboxing/unboxing.
public class
DemoAutoboxing {
public static void main(String args[]) {
Integer iOb = 100; //
mengautobox sebuah int
int i = iOb; // meng-auto-unbox
System.out.println(i +
" " + iOb); // menampilkan 100 100
}
}
Keluaran Program
100 100
8.
Selain pada kasus penugasan sederhana, autoboxing secara otomatis terjadi
ketika sebuah tipe primitif harus dikonversi menjadi objek; auto-boxing terjadi
ketika sebuah objek dikonversi menjadi tipe primitif. Jadi, autoboxing/unboxing
bisa saja terjadi ketika sebuah argumen dilewatkan kepada suatu metode, atau
ketika sebuah nilai dijadikan nilai balik oleh suatu metode. Tulislah sebuah
program untuk mengilustrasikan situasi ini.
Penyelesaian
// Autoboxing/unboxing terjadi pada
// parameter metode dan nilai baliknya.
public class
DemoAutoboxing2 {
// Mengambil sebuah parameter
Integer dan menghasilkan
// nilai balik int;
static int m(Integer v) {
return v ; // auto-unbox menjadi int
}
public static void main(String args[]) {
// Melewatkan sebuah int
kepada m() dan menugaskan nilai baliknya kepada
// sebuah Integer. Di sini,
argumen 100 diautobox menjadi
// sebuah Integer. Nilai
balik juga diautobox
// menjadi Integer.
Integer iOb = m(100);
System.out.println(iOb);
}
}
Keluaran Program
100
9.
Umumnya, autoboxing dan unboxing terjadi ketika sebuah konversi menjadi
objek atau dari objek diperlukan. Ini berlaku pula pada ekspresi. Di dalam
ekspresi, sebuah objek numerik secara otomatis diunbox. Keluaran dari ekspresi
dibox kembali, jika diperlukan. Tulislah sebuah program untuk mengilustrasikan situasi ini.
Penyelesaian
// Autoboxing/unboxing terjadi di dalam ekspresi.
public class
DemoAutoboxing3 {
public static void main(String args[]) {
Integer iOb, iOb2;
int i;
iOb = 100;
System.out.println("Nilai awal dari iOb: " + iOb);
// Statemen berikut secara
otomatis mengunbox iOb,
// melakukan inkreman, dan
kemudian membox kembali
// hasilnya menjadi iOb.
++iOb;
System.out.println("Setelah ++iOb: " + iOb);
// Di sini, iOb diunbox,
ekspresi dievaluasi,
// dan hasilnya dibox
kembali dan
// ditugaskan kepada iOb2.
iOb2 = iOb + (iOb / 3);
System.out.println("iOb2 setelah ekspresi: " + iOb2);
// Ekspresi yang sama
dievaluasi, tetapi
// hasilnya tidak dibox
kembali.
i = iOb + (iOb / 3);
System.out.println("i setelah ekspresi: " + i);
}
}
Keluaran Program
Nilai awal dari iOb: 100
Setelah ++iOb: 101
iOb2 setelah ekspresi: 134
i setelah ekspresi: 134
10. Auto-unboxing
juga memampukan Anda untuk mencampur pelbagai tipe objek numerik di dalam suatu
ekspresi. Begitu nilai-nilai diunbox, promosi dan konversi tipe diterapkan. Tulislah sebuah program
untuk mengilustrasikan situasi ini.
Penyelesaian
public class
DemoAutoboxing4 {
public static void main(String args[]) {
Integer iOb = 100;
Double dOb = 98.6;
dOb = dOb + iOb;
System.out.println("dOb setelah ekspresi: " + dOb);
}
}
Keluaran Program
dOb setelah ekspresi: 198.6
11. Autoboxing/unboxing
juga dapat diterapkan pada tipe wrapper Boolean
dan Character. Tulislah sebuah program untuk
mengilustrasikan situasi ini.
Penyelesaian
// Autoboxing/unboxing pada Boolean dan Character.
public class
DemoAutoboxing5 {
public static void main(String args[]) {
// Autobox/unbox sebuah
boolean.
Boolean b = true;
// Di bawah, b diunbox
ketika digunakan di dalam
// ekspresi kondisional,
seperti if.
if(b) System.out.println("b
bernilai true");
// Autobox/unbox terhadap
char.
Character ch = 'x'; // membox char
char ch2 = ch; // mengunbox char
System.out.println("ch2 adalah " + ch2);
}
}
Keluaran Program
b bernilai true
ch2 adalah x
12. Sejak JDK5, sebuah
fasilitas baru ditambahkan pada Java yang memampukan Anda untuk menanamkan
informasi suplemental pada suatu file sumber. Informasi ini, dinamakan dengan
annotasi, tidak mengubah aksi program. Jadi, annotasi tetap mempertahankan
semantika program. Namun, informasi ini dapat dipakai oleh pelbagai perangkat
pada saat pengembangan program. Istilah metadata juga dipakai untuk fitur ini,
tetapi istilah annotasi yang paling deskriptif dan paling umum digunakan. Tulislah sebuah program
untuk mengilustrasikan situasi ini.
Penyelesaian
import java.lang.annotation.*;
import java.lang.reflect.*;
// Deklarasi tipe annotasi.
@Retention(RetentionPolicy.RUNTIME)
@interface AnnoKu {
String str();
int val();
}
public class
DemoAnnotasi {
// Mengannotasi sebuah metode.
@AnnoKu(str = "Contoh Annotasi", val = 100)
public static void metodeKu() {
DemoAnnotasi ob = new DemoAnnotasi();
// Mendapatkan annotasi
untuk metode ini
// dan menampilkan
nilai-nilai anggota.
try {
// Pertama, mendapatkan
sebuah objek Class yang
// merepresentasikan
kelas ini.
Class c = ob.getClass();
// Sekarang, mendapatkan sebuah objek
Method yang
// merepresentasikan
metode ini.
Method m = c.getMethod("metodeKu");
// Selanjutnya,
mendapatkan annotasi untuk kelas ini.
AnnoKu anno = m.getAnnotation(AnnoKu.class);
// Terakhir, menampilkan
nilai-nilai.
System.out.println(anno.str() + " " + anno.val());
}
catch (NoSuchMethodException exc) {
System.out.println("Metode
tidak ditemukan.");
}
}
public static void main(String args[]) {
metodeKu();
}
}
Keluaran Program
Contoh Annotasi 100
13. Pada soal no 12, metodeKu tidak memiliki parameter.
Jadi, ketika getMethod dipanggil,
hanya nama metodeKu yang dilewatkan.
Namun, untuk mendapatkan sebuah metode yang memiliki parameter-parameter, Anda
harus menetapkan objek-objek kelas yang merepresentasikan tipe-tipe parameter
sebagai argumen-argumen pada getMethod.
Tulislah sebuah program untuk mengilustrasikan situasi ini.
Penyelesaian
import java.lang.annotation.*;
import java.lang.reflect.*;
@Retention(RetentionPolicy.RUNTIME)
@interface AnnoKu {
String str();
int val();
}
public class
DemoAnnotasi2 {
// metodeKu sekarang memiliki
dua parameter.
@AnnoKu(str = "Dua parameter", val = 19)
public static void metodeKu(String str, int i) {
DemoAnnotasi2 ob = new DemoAnnotasi2();
try {
Class c = ob.getClass();
// Di sini, tipe
parameter ditetapkan.
Method m = c.getMethod("metodeKu",
String.class, int.class);
AnnoKu anno =
m.getAnnotation(AnnoKu.class);
System.out.println(anno.str() + " " + anno.val());
}
catch (NoSuchMethodException exc) {
System.out.println("Metode
tidak ditemukan.");
}
}
public static void main(String args[]) {
metodeKu("test", 10);
}
}
Keluaran Program
Dua parameter 19
14. Tulislah sebuah
program yang menunjukkan bagaimana mendapatkan semua annotasi yang berkaitan
dengan sebuah kelas dan dengan sebuah metode. Program harus mendeklarasikan dua
annotasi, dan kemudian menggunakannya untuk mengannotasi sebuah kelas dan
sebuah metode.
Penyelesaian
// Menampilkan semua annotasi untuk kelas dan metode.
import java.lang.annotation.*;
import java.lang.reflect.*;
@Retention(RetentionPolicy.RUNTIME)
@interface AnnoKu {
String str();
int val();
}
@Retention(RetentionPolicy.RUNTIME)
@interface Apa {
String deskripsi();
}
@Apa(deskripsi = "Sebuah
annotasi untuk kelas")
@AnnoKu(str = "DemoAnnotasi3",
val = 99)
public class
DemoAnnotasi3 {
@Apa(deskripsi = "Sebuah annotasi untuk metode")
@AnnoKu(str = "Menguji", val = 100)
public static void metodeKu() {
DemoAnnotasi3 ob = new
DemoAnnotasi3();
try {
Annotation annotasi[] =
ob.getClass().getAnnotations();
// Menampilkan semua
annotasi untuk DemoAnnotasi3.
System.out.println("Semua annotasi untuk DemoAnnotasi3:");
for(Annotation a : annotasi)
System.out.println(a);
System.out.println();
// Menampilkan semua
annotasi untuk metodeKu.
Method m = ob.getClass( ).getMethod("metodeKu");
annotasi =
m.getAnnotations();
System.out.println("Semua
annotasi untuk metodeKu:");
for(Annotation a : annotasi)
System.out.println(a);
}
catch (NoSuchMethodException exc) {
System.out.println("Metode
tidak ditemukan.");
}
}
public static void main(String args[]) {
metodeKu();
}
}
Keluaran Program
Semua annotasi untuk DemoAnnotasi3:
@AnnoKu(str=DemoAnnotasi3, val=99)
@Apa(deskripsi=Sebuah annotasi untuk kelas)
Semua annotasi untuk metodeKu:
@Apa(deskripsi=Sebuah annotasi untuk metode)
@AnnoKu(str=Menguji, val=100)
15. Anda dapat
memberikan nilai default bagi anggota annotasi yang akan dipakai jika tidak ada
nilai yang ditetapkan ketika annotasi diterapkan. Nilai default ditetapkan
dengan menambahkan klausa default
pada deklarasi anggota annotasi. Tulislah sebuah program untuk mengilustrasikan situasi ini.
Penyelesaian
import java.lang.annotation.*;
import java.lang.reflect.*;
// Sebuah deklarasi tipe annotasi yang mencakup nilai default.
@Retention(RetentionPolicy.RUNTIME)
@interface AnnoKu {
String str() default
"Menguji";
int val() default 9000;
}
public class
DemoAnnotasi4 {
// Mengannotasi sebuah metode
menggunakan nilai-nilai default.
@AnnoKu()
public static void metodeKu() {
DemoAnnotasi4 ob = new DemoAnnotasi4();
// Mendapatkan annotasi
untuk metode ini
// dan menampilkan
nilai-nilai anggota.
try {
Class c = ob.getClass();
Method m =
c.getMethod("metodeKu");
AnnoKu anno =
m.getAnnotation(AnnoKu.class);
System.out.println(anno.str() + " " + anno.val());
}
catch (NoSuchMethodException exc) {
System.out.println("Metode
tidak ditemukan.");
}
}
public static void main(String args[]) {
metodeKu();
}
}
Keluaran Program
Menguji 9000
No comments:
Post a Comment