You are on page 1of 33

IF2281 Pemrograman Java Fitur Java

Achmad Imam Kistijantoro Semester II 2006/2007

IF-ITB/AI/Apr 07 IF2281 Java Fitur Baru

Overview
Generik Autoboxing Enum Variable arguments enhanced for loop Refleksi

IF-ITB/AI/Apr 07 IF2281 Java Fitur Baru

Generik
Generik dimasukkan pada Java untuk meningkatkan performansi pada kelas yang bersifat umum, misalnya kelas untuk menangani koleksi public interface List extends Collection { Object get(int index); Object set(int index, Object element); boolean add(Object element); void add(int index, Object element); Object remove(int index); boolean addAll(int index, Collection c); int indexOf(Object o); int lastIndexOf(Object o); Iteration ListIterator listIterator(); }
IF-ITB/AI/Apr 07 IF2281 Java Konkuren 3

Generik
List myList = new ArrayList(); myList.add( new Person("amir" ) ); Person p = (Person) myList.get( 0 ); Downcast harus dilakukan saat runtime
performance cost maintenance cost: pemeriksaan tidak dapat dilakukan oleh kompilator

IF-ITB/AI/Apr 07 IF2281 Java Konkuren

public interface List<E> extends Collection<E> { E get(int index); E set(int index, E element); boolean add(E element); void add(int index, E element); E remove(int index); boolean addAll(int index, Collection<? extendsE> c); int indexOf(Object o); int lastIndexOf(Object o); ListIterator<E> listIterator(); }

IF-ITB/AI/Apr 07 IF2281 Java Konkuren

List<Person> myList = new ArrayList<Person>(); myList.add( new Person("amir" ) ); Person p = myList.get( 0 );

IF-ITB/AI/Apr 07 IF2281 Java Konkuren

Generik pada Java


Kelas generik pada java diimplementasikan sebagai parameter tipe hasil kompilasi kode kelas generik tetap hanya satu kelas, dengan parameter tipe yang diganti dengan tipe riil pada saat runtime pada C++, kompilasi menghasilkan kelas yang berbeda untuk setiap tipe generik

IF-ITB/AI/Apr 07 IF2281 Java Konkuren

Sintaks Generik
Mendefinisikan kelas & interface:
class NamaKelas<TipeGenerik> { ... } interface NamaInterface<TipeGenerik> { ... } class NamaKelas<TipeGenerik1, TipeGenerik2> { ... } interface NamaInterface<TipeGenerik1, TipeGenerik2> { ... }

Nama untuk tipe generik sebaiknya menggunakan sebuah karakter huruf besar, misalnya E atau T Kita dapat mendefinisikan tipe generik lebih dari satu

IF-ITB/AI/Apr 07 IF2281 Java Konkuren

Method generik
sintaks: Modifier <ParameterTipe> ReturnType MethodName( .. ) contoh:
class C { public <T> List<T> sebuahMethod(T o) { ... } }

Method generik digunakan:


untuk menyatakan hubungan tipe antar parameter sebuah method untuk menyatakan tipe generik yang tidak berkaitan dengan parameter tipe yang dimiliki kelas

Saat pemanggilan, tanda generik dapat dihilangkan, karena tipe generik dapat disimpulkan dari parameter yang digunakan:
C c = new C(); c.<String>sebuahMethod("string"); c.sebuahMethod("string");
IF-ITB/AI/Apr 07 IF2281 Java Fitur 9

Implementasi interface
Interface Generik dideklarasikan seperti kelas Generik: public interface List<E> { void add(E x); Iterator<E> iterator(); } Dan diimplementasikan seperti ini: public class MyList<E> implements List<E> { void add(E x) { /*implementasi Add*/} Iterator<E> iterator() { } }

IF-ITB/AI/Apr 07 IF2281 Java Konkuren

10

relasi subtipe antar kelas generik


Contoh: class Person { String nama; } class Student extends Person { String nim; } ... ArrayList<Person> a1 = new ArrayList<Person>(); ArrayList<Student> a2 = new ArrayList<Student>(); Person p = new Person(); Student s = new Student(); a1.add( s ); a2.add( p ); // tidak boleh a1 = new ArrayList<Student>(); // tidak boleh ArrayList<Student> bukan subtipe dari ArrayList<Person>, meskipun Student adalah subtipe dari Person
IF-ITB/AI/Apr 07 IF2281 Java Konkuren 11

wildcard
wildcard digunakan untuk menyatakan sebuah variabel yang dapat menerima tipe generik apa saja contoh: ArrayList<?> a3 = new ArrayList<Student>; wildcard dapat dibatasi, dengan memberi syarat bahwa tipe yang digunakan harus diturunkan dari kelas tertentu ArrayList<? extends Person> a3 = new ArrayList<Student>; atau merupakan parent dari kelas tertentu ArrayList<? super Student> a3 = new ArrayList<Person>;
IF-ITB/AI/Apr 07 IF2281 Fitur Java 12

contoh penggunaan
public void tulisNama(List<?> list) { for( Object o : list) { Person p = (Person) o; System.out.println( p.nama ); } } public void tulisNama(List<? extends Person> list) { for( Person p : list) { System.out.println( p.nama ); } }

IF-ITB/AI/Apr 07 IF2281 Fitur Java

13

Autoboxing
Autoboxing adalah fitur bahasa Java yang memungkinkan tipe primitif dan tipe kelas representasi primitif bisa saling dipertukarkan Contoh:
Integer v = new Integer( 5 ); int i = v.intValue(); i = v; ERROR pada JDK < 1.5 v = 5; List l = new ArrayList(); l.add( new Integer(5) ); i = ( (Integer) l.get( 0 )).intValue(); l.add( 5 ); ERROR pada JDK < 1.5 i = l.get( 0 );

IF-ITB/AI/Apr 07 IF2281 Fitur Java

14

sintaks for loop


for( parameter : ekspresi ) { } parameter adalah parameter yang digunakan untuk iterasi ekspresi harus bertipe array atau mengimplementasikan interface Iterable contoh:
public int sumArray(int arr[]) { int sum = 0; for(int i : arr) { sum += i; } return sum; }
IF-ITB/AI/Apr 07 IF2281 Fitur Java 15

Iterable
kelas koleksi dapat menggunakan sintaks for ini asalkan mengimplementasikan interface Iterable:
interface Iterable<T> { Iterator<T> iterator(); } interface Iterator<E> { boolean hasNext(); E next(); remove(); }

semua kelas koleksi pada Java mengimplementasikan interface Iterable

IF-ITB/AI/Apr 07 IF2281 Fitur Java

16

Vector v<String> = new Vector<String>(); v.add("Hello"); for(String e: v) { System.out.println(e); }

IF-ITB/AI/Apr 07 IF2281 Fitur Java

17

Enum
Tipe enumerasi adalah tipe yang terdiri atas nilai-nilai yang sudah terdefinisi Konsep ini ada pada C, C++, dan bahkan Pascal Contoh :
public enum Direction {LEFT, RIGHT, UP, DOWN};

Pada JDK < 1.5, kode atas dituliskan sebagai


class Direction { public final static public final static public final static public final static } int int int int LEFT = 1; RIGHT = 2; UP = 3; DOWN = 4;

cara ini tidak type-safe, karena menggunakan tipe int, yang memungkinkan nilai lain selain 1-4
IF-ITB/AI/Apr 07 IF2281 Fitur Java 18

variable arguments
Variable arguments memungkinkan method memiliki argumen yang jumlahnya tidak tetap
seperti fungsi printf atau scanf di C

Variable arguments diimplementasikan sebagai array Parameter variabel dideklarasikan dengan tanda tiga titik (...) antara nama tipe dan nama variabel:
Contoh: void cetak(String ... nama);

Parameter yang variabel harus di posisi terakhir


Boleh: void cetak(int nomor, String ...nama); Tidak boleh: void cetak(String ... nama, int nomor);

IF-ITB/AI/Apr 07 IF2281 Fitur Java

19

Contoh deklarasi:
void cetak(String ... nama) {/*...*/ }

Contoh pemanggilan:
cetak(Java, C++, Python);

Karena varargs adalah array, maka kode ini sama dengan di atas:
String sx[] = {"Java", "C++","Python"}; cetak(sx);

IF-ITB/AI/Apr 07 IF2281 Fitur Java

20

Perhatikan method cetak dalam kelas Test:

class Test { public static void cetak(String ... arg){ for (int i = 0; i<arg.length; i++){ System.out.println(arg[i]); } } }

IF-ITB/AI/Apr 07 IF2281 Fitur Java

21

Import static
Memungkinkan programmer mengakses variabel, method, atau konstanta statik tanpa menyebut nama kelasnya Contoh: import static java.lang.Math.*; class Test { public static void main(String argv[]) { System.out.println(sin(0)); /*biasanya harus Math.sin(0)*/ } }

IF-ITB/AI/Apr 07 IF2281 Fitur Java

22

Reflection
Fasilitas API yang disediakan Java untuk melakukan query terhadap kelas pada saat runtime Sebelum sebuah instance dari suatu kelas dapat dibuat dan digunakan, JVM terlebih dahulu akan meload class ke dalam memori

User program

Class Loader

Java API

Bytecode execution engine JVM


IF-ITB/AI/Apr 07 IF2281 Java Konkuren 23

Dynamic class loading


JVM dapat me-load sebuah kelas secara dinamik, kelas diload ke memori hanya pada saat akan digunakan saja. kelas dapat dibaca dari file system atau mekanisme lain (jaringan, basis data, hasil kompilasi langsung) Reflection API berperan membantu programmer untuk mengetahui detil tentang kelas:
nama kelas method apa yang disediakan beserta parameternya atribut sebuah kelas membuat instance sebuah kelas dengan menggunakan nama memanggil method

IF-ITB/AI/Apr 07 IF2281 Java Konkuren

24

Class
kelas Class (java.lang.Class) adalah kelas yang merepresentasikan sebuah kelas pada java Class menyediakan fungsi untuk membuat instance, mendapatkan informasi tentang sebuah kelas instance dari Class dapat didapat dengan cara:

Class c = Class.forName("java.lang.String"); Class d = String.class; ... String s = "Ini string"; Class d = s.getClass();

IF-ITB/AI/Apr 07 IF2281 Java Konkuren

25

pemakaian Class
Instance dari sebuah kelas dapat dibuat melalui Class:
Class c = Class.forName("java.lang.String"); Object o= c.newInstance();

Query kelas: informasi tentang kelas parent & interface:


Class cparent = c.getSuperclass(); Class[] cinterfaces = c.getInterfaces();

informasi tentang atribut:


Field[] fields = c.getFields(); Field[] fields = c.getDeclaredFields();

informasi tentang method:


Method[] m = c.getMethods();
IF-ITB/AI/Apr 07 IF2281 Java Konkuren 26

Field
kelas yang merepresentasikan atribut publik sebuah kelas
melakukan query nama field: getName() mengetahui modifier sebuah atribut public, private, protected, static, final - getModifiers() membaca & memberi nilai atribut: public class Buku { String judul; String pengarang; public static void main(String args[]) { Object b = Class.forName("Buku").newInstance(); try { Class c = b.getClass(); Field f = c.getDeclaredField("judul"); f.set( b, "judul buku baru"); } IF-ITB/AI/Apr 07 } IF2281 Java Konkuren }

27

Method
Kelas yang merepresentasikan sebuah method: nama, parameter, return value, modifier, memanggil sebuah method
Class c = String.class; Methods m[] = c.getMethods(); for (Method e: m) { System.out.println(e.getName()); } Class c = Class.forName("java.lang.String"); Object o = c.newInstance(); Method m = c.getMethod("length"); Object result = m.invoke( o );

IF-ITB/AI/Apr 07 IF2281 Java Konkuren

28

Proxy
proxy adalah kelas untuk membuat instance proxy dinamik, yaitu objek yang mengimplementasikan satu atau lebih interface namun dibuat pada saat runtime. contoh:
public interface MyIf { public void methodA(String x); } ... MyHandler handler = new MyHandler(); MyIf o = (MyIf) Proxy.newProxyInstance( MyIf.class.getClassLoader(), new Class[] { MyIf.class }, handler ); o.methodA("sebuah string");
IF-ITB/AI/Apr 07 IF2281 Java Konkuren 29

Proxy
class MyHandler implements InvocationHandler { Object invoke( Object p, Method m, Object[] args) { System.out.println("proxy class: "+p.getClass().getName() ); System.out.println("method name: "+m.getName() ); if( args != null ) { for(int i=0;i < args.length;i++) { System.out.println("parameter "+i+" : "+ args[i] ); } } } }

IF-ITB/AI/Apr 07 IF2281 Java Konkuren

30

Contoh penggunaan reflection


Pada application server: programmer dapat mendeploy berbagai jenis kelas (e.g. EJB beans) yang tidak dikenal oleh kode application server pada saat compile-time Application server harus dapat menyediakan kode stub yang bisa digunakan client untuk memanggil objek EJB yang berada pada server. Kode stub harus memiliki interface/tipe yang sama dengan EJB Ada 2 teknik:
pada saat deploy (proses peletakan objek ke server), deployer akan "membaca" kelas EJB yang akan di-deploy, dan menggenerate kode java baru yang memiliki interface yang sama untuk digunakan sebagai stub di sisi client. Kode ini dikompilasi dan digunakan pada saat runtime -> pendekatan yang digunakan RMI pada saat run-time, deployer membangkitkan kode stub menggunakan kelas proxy untuk digunakan di sisi client
IF-ITB/AI/Apr 07 IF2281 Java Konkuren 31

Penutup
Java dikembangkan dari bahasa C/C++ dengan menghilangkan fitur2 yang kompleks, agar memudahkan developer sejalan dengan waktu, bahasa Java berkembang menjadi makin kompleks fitur ditambahkan sesuai kebutuhan. Andai fitur tersebut disediakan sejak awal, mungkin membuat developer enggan mempelajari bahasa baru, karena terlalu kompleks

IF-ITB/AI/Apr 07 IF2281 Fitur Java

32

Sumber
Yohanes Nugroho , Perkembangan Fitur Java (JDK 1.1 s/d JDK 1.5). Materi IF2281, revisi IL, 2005 James Gosling, Bill Joy, Guy Steele and Gilad Bracha. The Java Language Specification Third Edition. 2005

IF-ITB/AI/Apr 07 IF2281 Fitur Java

33

You might also like