Monday, December 26, 2016

Bab 12. Soal & Penyelesaian Java


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