Professional Documents
Culture Documents
Overview
Generik Autoboxing Enum Variable arguments enhanced for loop Refleksi
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
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(); }
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
Method generik
sintaks: Modifier <ParameterTipe> ReturnType MethodName( .. ) contoh:
class C { public <T> List<T> sebuahMethod(T o) { ... } }
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() { } }
10
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 ); } }
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 );
14
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(); }
16
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};
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);
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);
20
class Test { public static void cetak(String ... arg){ for (int i = 0; i<arg.length; i++){ System.out.println(arg[i]); } } }
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)*/ } }
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
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();
25
pemakaian Class
Instance dari sebuah kelas dapat dibuat melalui Class:
Class c = Class.forName("java.lang.String"); Object o= c.newInstance();
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 );
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] ); } } } }
30
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
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
33