Java 5 Tiger, 2007 - Cornelius Koo Published by Elex Media Komputindo BAB 7 STATIC IMPORTS Kita seringkali mengetikkan perintah-perintah panjang dan berulang-ulang saat melakukan coding di Java. Dalam satu source code file mungkin kita bisa mengetikkan berkali-kali perintah System.out.println(“...”). Di java 5 kita diberikan suatu fasilitas yang dapat mempersingkat beberapa perintah yang cukup panjang. Fasilitas baru ini disebut static import, karena kita sekarang di Java 5 diperbolehkan menambahkan keyword static pada saat meng-import kelas. import static java.lang.System.out; public class StaticImport { public static void main(String[] args) { out.println("Hello \"Static Import\" World"); } } Java 5 Tiger, 2007 - Cornelius Koo Published by Elex Media Komputindo Dari contoh diatas terlihat setelah kita memakai static import maka pemanggilan perintah println tidak lagi memakai kata System. 7.1 Aturan Static Import Keyword static letaknya selalu di belakang keyword import. Static import java.lang.System.out; public class StaticImport { public static void main(String[] args) { out.println("Hello \"Static Import\" World"); } } Java 5 Tiger, 2007 - Cornelius Koo Published by Elex Media Komputindo Gambar 7.1 Keyword static yang ditaruh di depan akan menimbulkan error Hanya static member (method dan variabel) yang mampu diimport. public class TestClass { public static int var; public static final double PI = 3.14; public double value; public static void printSomething() { System.out.println("print something"); } public void printA() { System.out.println("A"); } } Java 5 Tiger, 2007 - Cornelius Koo Published by Elex Media Komputindo Gambar 7.2 Saat kita akan memakai static import untuk kelas TestClass maka yang muncul hanyalah member yang static saja. 7.2 Pemakaian Static Import untuk Static Inner Class Static inner class dapat di-import juga dengan memakai static import. Berikut adalah contoh program yang melibatkan static inner class : import static java.lang.System.out; import static staticimport.TestStaticInnerClass.InnerClass; import static staticimport.TestStaticInnerClass.InnerClass.doSomething; public class TestStaticInnerClass { static class InnerClass { Java 5 Tiger, 2007 - Cornelius Koo Published by Elex Media Komputindo InnerClass() { out.println("Inner Class"); } public static void doSomething(String str) { System.out.println("do something "+str); } } public static void main(String[] args) { InnerClass inner = new InnerClass(); inner.doSomething("from object"); doSomething("direct call"); } } Gambar 7.3 Hasil eksekusi program TestStaticInnerClass.java Pada contoh program diatas, kita membuat sebuah static inner class (kelas di dalam kelas) bernama InnerClass. Di dalam InnerClass, kita mendefinisikan sebuah static method bernama doSomething(String str). ... static class InnerClass { InnerClass() { out.println("Inner Class"); } public static void doSomething(String str) { System.out.println("do something "+str); } } Java 5 Tiger, 2007 - Cornelius Koo Published by Elex Media Komputindo ... Jika kita ingin mempersingkat penulisannya dalam kode program, kita bisa memanfaatkan feature static import pada Java 5. import static java.lang.System.out; import static staticimport.TestStaticInnerClass.InnerClass; import static staticimport.TestStaticInnerClass.InnerClass.doSomething; ... Setelah di-import dengan static import, kita bisa menghilangkan nama outer class nya (TestStaticInnerClass), bahkan kita bisa memanggil method doSomething(…) dengan langsung memanggil nama methodnya tanpa harus menyertakan nama outer class maupun inner class. 7.3 Pemakaian wildcard (*) pada static import Kita bisa memakai wildcard (*) pada import biasa yang fungsinya supaya semua kelas dalam package yang di-import bisa dikenali. Hal yang sama berlaku pada static import. Perbedaannya adalah pada static import, wildcard (*) berfungsi agar semua static member dalam suatu kelas bisa dikenali. Berikut contoh programnya. import static java.lang.Math.*; public class Wildcard { public static void main(String[] args) { double val = -4.31; System.out.println("Value : "+val); System.out.println("Ceil : "+ceil(val)); System.out.println("Floor : "+floor(val)); System.out.println("Round : "+round(val)); System.out.println("Sqr root : "+sqrt(val)); } Java 5 Tiger, 2007 - Cornelius Koo Published by Elex Media Komputindo } Gambar 7.4 Hasil eksekusi program Wildcard.java 7.4 Static import pada enum Enum juga bisa di-import dengan menggunakan static import. Kita tinggal menuliskan elemen-elemen konstanta yang ada di dalam sebuah enum. Berikut contohnya. public enum Level { Beginner, Medium, Advanced } import static staticimport.Level.*; public class EnumStaticImport { public static void main(String[] args) { System.out.println(Beginner); System.out.println(Medium); System.out.println(Advanced); } } Java 5 Tiger, 2007 - Cornelius Koo Published by Elex Media Komputindo Inline enum juga bisa di-import dengan static import. Pemakaiannya tidaklah berbeda dengan static import untuk enum biasa. package staticimport; public class TestInlineEnum { public enum Range { SHORT, MEDIUM, LONG } } import static staticimport.Level.*; import static staticimport.TestInlineEnum.Range.*; public class EnumStaticImport { public static void main(String[] args) { System.out.println(Beginner); System.out.println(Medium); System.out.println(Advanced); System.out.println(SHORT); System.out.println(MEDIUM); System.out.println(LONG); } } 7.5 Konflik penamaan pada static import Pemakaian static import menghadapi masalah klasik yang juga dihadapi oleh import biasa, yaitu namespace conflict. Konflik penamaan ini agak berbeda kasus dan penanganannya di static import. Java 5 Tiger, 2007 - Cornelius Koo Published by Elex Media Komputindo import java.util.Arrays; public class ArraySorter { public static void sort(int[] ar) { // ... do some sorting process } } import static java.util.Arrays.sort; import java.io.PrintStream; import java.io.PrintWriter; // conflict import static staticimport.ArraySorter.sort; public class SameMemberName { // variable hiding public static void printIt(PrintStream out, int toBePrint) { out.println(toBePrint); } public static void main(String[] args) { int[] array = {2,4,6,2,3}; sort(array); // ambiguous method call for (int e : array) { System.out.println(e); printIt(System.out, e); } } } Java 5 Tiger, 2007 - Cornelius Koo Published by Elex Media Komputindo Pada kasus di atas, method sort() mengalami konflik penamaan karena ada dua buah method sort() yang menerima parameter dengan tipe yang sama. Peringatan akan muncul ketika dikompilasi. Kompiler akan menganggap pemanggilan method sort() sebagai pemanggilan yang ambigu, karena ada dua buah method sort() yang identik walaupun berada di package yang berbeda. import static java.util.Arrays.sort; ... // conflict import static staticimport.ArraySorter.sort; Jika method sort() memiliki parameter dengan tipe yang berbeda, maka yang terjadi adalah semacam overloading. Kompiler secara otomatis akan memilih method dengan tipe parameter yang sesuai. Java 5 Tiger, 2007 - Cornelius Koo Published by Elex Media Komputindo Gambar 7.5 Pesan kesalahan kompilasi yang muncul di eclipse saat terjadi konflik penamaan.