27 Mayıs 2011 Cuma

Apache Commons Lang Kütüphanesi-1: lang.* Paketi

Apache Commons projesini incelemeye Lang kütüphanesi ile devam ediyoruz.

Lang kütüphanesi JDK'nın java.lang paketine bazı genel, çok sık kullanılan, her programcının işine yarayabilecek bileşenler ekler. Şimdi bunlardan en çok göze çarpanları inceleyelim. Açıklamaları yazarken zaman kaybetmemek için kodun içinde yapacağım.

CharsetUtils sınıfı karakterlerle alakalı işlemler için birkaç yardımcı statik metod barındırır. Not: Her ne kadar aşağıdaki kod örneklerinde aranacak karakterleri (ikinci parametre) String olarak belirtsek de, içindeki karakterlerin hepsi için tek tek kontrol yapılır.

import org.apache.commons.lang.CharSet;
import org.apache.commons.lang.CharSetUtils;
public class CharSetUtilsDeneme {
    public static void main(String[] args) {
        //Birinci parametredeki String'in içinde,
        //İkinci parametredeki karakterleri sayar.
        System.out.println("B and o count = " +
            CharSetUtils.count("BorisBecker", "Bo")); //3
        System.out.println("B,o,k,e and r count = " +
            CharSetUtils.count("BorisBecker", new String[] { "Bo", "ker" })); //8

        //Birinci parametredeki String'in içinden,
        //İkinci parametredeki karakterleri siler.
        System.out.println("Delete B and o = " +
            CharSetUtils.delete("BorisBecker", "Bo")); //risecker
        System.out.println("Delete B,o,k,e and r = " +
            CharSetUtils.delete("BorisBecker", new String[] { "Bo", "ker" })); //isc

        //Birinci parametredeki String'in içinde,
        //sadece ikinci parametredeki karakterleri tutar. Diğerlerini siler.
        System.out.println("Keep B and o = " +
            CharSetUtils.keep("BorisBecker", "Bo")); //BoB

        //Birinci parametredeki String'in içinden,
        //İkinci parametredeki karakterlerin tekrarlarını siler.
        System.out.println("Squeeze B and o = " +
            CharSetUtils.squeeze("BBoooorisbbbecker", "Bo")); //Borisbbbecker
    }
}

Çıktısı:
B and o count = 3
B,o,k,e and r count = 8
Delete B and o = risecker
Delete B,o,k,e and r = isc
Keep B and o = BoB
Squeeze B and o = Borisbbbecker

ObjectUtils sınıfı equals, toString gibi bütün sınıflar için ortak olan bazı metodların NullPointerException fırlatılmasına karşı daha güvenilir olan biçimlerini içerir. Bu metodları kullanarak örneğin null referanslı bir nesne için toString metodu çağırıldığında "null" yerine "" veya "Boş referans" gibi istediğiniz bir karakter katarının dönülmesini sağlayabilirsiniz.

import org.apache.commons.lang.ObjectUtils;

/**
 * Bu sınıfta kullanılan metodların hepsi NullPointerException'a
 * karşı güvenlidir. null veri girilse bile hata fırlatmaz
 */
public class ObjectUtilsTrial {
    public static void main(String[] args) {
        //ObjectUtilsTrial nesnelerini oluşturalım
        ObjectUtilsTrial one = new ObjectUtilsTrial();
        ObjectUtilsTrial two = one; //Aynı referans
        ObjectUtilsTrial three = new ObjectUtilsTrial(); //Yeni nesne
        ObjectUtilsTrial four = null;

        //birinci referans null ise ikinci nesneyi dön
        System.out.print("1) If null return DEFAULT >>>");
        System.out.println(ObjectUtils.defaultIfNull(four, three));

        //equals kontrolü
  //ikisi de aynı nesneyi refere ediyor.
        System.out.print("2) References to the same object >>>");
        System.out.println(ObjectUtils.equals(one, two));

  //equals kontrolü
        //farklı nesneleri refere ediyorlar.
        System.out.print("3) Check object references and not values >>>");
        System.out.println(ObjectUtils.equals(one, three));

        //toString methodu çağırılır
        System.out.print("4) toSring gets invoked >>>");
        System.out.println(one);

        //nesnenin detaylarını gösterir. toString metodu çağırılmaz
        System.out.print("5) Display object details >>>");
        System.out.println(ObjectUtils.identityToString(one));

        //toString'e null geçilse bile boş karakter katarı dönülür: ""
  //çıktı **** olacaktır
        System.out.print("6) Pass null and get back an Empty string >>>");
        System.out.println("**" + ObjectUtils.toString(null) + "**");
  
  //null verinin hashCode'u 0 olarak dönülür
  //çıktı **0** olacaktır
        System.out.print("6) Pass null and get back an Empty string >>>");
        System.out.println("**" + ObjectUtils.hashCode(null) + "**");
    }

    public String toString() {
        return "toString Output";
    }
}


Bu paketteki bir başka yardımcı sınıf da SerializationUtils'dir. Java'da en basit dosyaya okuma işlemi için bile bir ton sınıfla uğraşmanız gerekir. Bu sınıf serileştirme işlemini tek bir metod çağrısına kadar indirger. Tek yapmanız gereken serileştirmek istediğiniz veriyi ve çıktıyı vereceğiniz akışı belirmektir. Örneğin;

//File to serialize object to
String fileName = "testSerialization.ser";

//New file output stream for the file
FileOutputStream fos = new FileOutputStream(fileName);

//Serialize String
SerializationUtils.serialize("SERIALIZE THIS", fos);
fos.close();

//Open FileInputStream to the file
FileInputStream fis = new FileInputStream(fileName);

//Deserialize and cast into String
String ser = (String) SerializationUtils.deserialize(fis);
System.out.println(ser);
fis.close();

StringUtils sınıfı belki de bu pakette en çok kullanacağız sınıf olacak. İçinde 100'den fazla statik metod bulunur. Bu metodlar java.lan.String sınıfınının karakter katarı işlemede yetersiz kaldığı durumlardaki boşluğu doldurur. Ayrıca hepsi NullPointerException'a karşı güvenilirdir. Şimdi bu metodlardan bazıları iş başında görelim:

import org.apache.commons.lang.StringUtils;

public class StringUtilsTrial {
    public static void main(String[] args) {
        //12 karakter kısalt
        System.out.println("1) Abbreviate Once upon a time >>>" +
            StringUtils.abbreviate("Once upon a time ", 12));

        //İki karakter katarının benzerliklerinin bittiği yerin indexini döner.
        System.out.println(
            "2) Index Of Difference between ABCXYZ and ABCPQR >>>" +
            StringUtils.indexOfDifference("ABCXYZ", "ABCPQR"));

        //Karakter katarının sonundan, ikinci argümandaki katarı çıkar.
        System.out.println("3) Chomp END >>>" +
            StringUtils.chomp("A test String END", "END"));

        //İlk argümanın sadece ikinci argümandaki karakterleri içerdiğini doğrular
        System.out.println("4) Check if 643287460 contains only 0123456789 >>>" +
            StringUtils.containsOnly("643287460", "0123456789"));

        //İki argümanı karşılaştırır, farklı oldukları kısmı döner.
        System.out.println("5) Compare ABCDEFG and ABCdefg >>>" +
            StringUtils.difference("ABCDEFG", "ABCdefg"));

        //Girilen nesne referansı null ise, "" dönülür.
        //ObjectUtils.toString() ile aynıdır.
        System.out.println("6) Return default string >>>" + "**" +
            StringUtils.defaultString(null) + "**");

        //Dizideki bütün karakter katarlarını araya "$#$" koyarak bir katara yerleştirir
        System.out.println("7) Join Strings using separator >>>" +
            StringUtils.join(new String[] { "AB", "CD", "EF" }, "$#$"));

        //SubString
        System.out.println("8) Substring >>>" +
            StringUtils.substring("SUBSTRING", 1, 5));

        //Katarı ters çevirir.
        System.out.println("9) Reverse >>>" + StringUtils.reverse("REVERSE"));

        //Katardaki boşlukları budar. null ise "" döner.
        System.out.println("10) Trim String. No NullPointerException >>>" +
            StringUtils.trim(null));

        //Katardaki boşlukları budar. null ise "" döner.
        System.out.println("11) Empty String >>>" +
            StringUtils.trimToEmpty(null) + "<<<");

        //Equals kontrolu yapar. NullPointerException fırlatmaz!
        System.out.println("12) Comapre null and null >>>" +
            StringUtils.equals(null, null));

        //Baştaki ve sondaki boşlukları budar
        //null ise "" döner.
        System.out.println("13) Strip whitespace >>>" +
            StringUtils.stripToEmpty("     ABCD      "));

        //İlk argümandaki katarın "!@#$%^&*" karakterlerini içermediğini doğrular
        System.out.println("14) Check that ABCD contains none of !@#$%^&* >>>" +
            StringUtils.containsNone("ABCD", "!@#$%^&*"));
    }
}

SystemUtils sistem değişkenlerini okur ve uygun değerleri döner. Örneğin programınızın çalışacağı sistemin Java'nın en az 1.3 sürümünü desteklemesinin istiyorsanız: SystemUtils.isJavaVersionAtLeast(1.3f)); metodunu kullanabilirsiniz. Örnek kullanım:

import org.apache.commons.lang.SystemUtils;

public class SystemUtilsTrial {
    public static void main(String[] args) {
        System.out.println("1) FILE_SEPARATOR =" + SystemUtils.FILE_SEPARATOR);
        System.out.println("2) JAVA_EXT_DIRS =" + SystemUtils.JAVA_EXT_DIRS);
        System.out.println("3) JAVA_HOME =" + SystemUtils.JAVA_HOME);
        System.out.println("4) Is 1.3 + =" +
            SystemUtils.isJavaVersionAtLeast(1.3f));
        System.out.println("5) JAVA_EXT_DIRS =" + SystemUtils.JAVA_EXT_DIRS);
        System.out.println("6) JAVA_VENDOR =" + SystemUtils.JAVA_VENDOR);
        System.out.println("7) OS_NAME =" + SystemUtils.OS_NAME);
    }
}

Çıktısı:
1) FILE_SEPARATOR =\
2) JAVA_EXT_DIRS =C:\JDeveloper\jdk\jre\lib\ext
3) JAVA_HOME =C:\JDeveloper\jdk\jre
4) Is 1.3 + =true
5) JAVA_EXT_DIRS =C:\JDeveloper\jdk\jre\lib\ext
6) JAVA_VENDOR =Sun Microsystems Inc.
7) OS_NAME =Windows 2000

ClassUtils sınıfı Java Reflection API'yi kullanmadan sınıflarınız hakkında daha detaylı bilgiye sahip olmanızı sağlar. Ancak bu metodları kullanırken iki kere düşünün. Çünkü çoğu durumda böyle bir özelliği kullanmanız yazılımınızın tasarımının kötü olduğu anlamına gelir.

import org.apache.commons.lang.ClassUtils;

public class ClassUtilsTrial {
    public static void main(String[] args) {
        System.out.println("1) Interfaces implemented by java.lang.String >>> " +
            ClassUtils.getAllInterfaces(String.class));
        System.out.println("2) SuperClasses of java.lang.String >>> " +
            ClassUtils.getAllSuperclasses(String.class));
        System.out.println("3) PackageName of a string >>> " +
            ClassUtils.getPackageName("A String", "IfNull"));
        System.out.println("4) Every String is an Object = " +
            ClassUtils.isAssignable(String.class, Object.class));
        System.out.println("5) Every Object is an String = " +
            ClassUtils.isAssignable(Object.class, String.class));
    }
}

Çıktısı:
1) Interfaces implemented by java.lang.String >>> [interface java.io.Serializable
, interface java.lang.Comparable, interface java.lang.CharSequence]
2) SuperClasses of java.lang.String >>> [class java.lang.Object]
3) PackageName of a string >>> java.lang
4) Every String is an Object = true
5) Every Object is an String = false

StringEscapeUtils sınıfı da yeri geldiğinde çok işinize yarayacak bir sınıftır. Program yazarken bazen Java sözdizimi ile  HTML, JavaScript, SQL gibi dillerin söz dizimleri karışabilir. Örneğin; bir servlet'in <p>MyName<p> metnini ekrana basmasını isteyip doğrudan sayfaya yazdırırsanız, web sunucusu bunu HTML olarak olarak yorumlayıp <p><p> etiketlerini kaldıracaktır: MyName. Bu hatadan kurtulmak için StringEscapeUtils'in sağladığı metodları kullanabilirsiniz. StringEscapeUtils HTML'den başka birçok dili daha desteklemekte:

import org.apache.commons.lang.StringEscapeUtils;

public class StringEscapeUtilsTrial {
    public static void main(String[] args) {
        String strHTMLInput = "<p>MyName<p>";
        String strEscapeHTML = StringEscapeUtils.escapeHtml(strHTMLInput);
        String strUnEscapeHTML = StringEscapeUtils.unescapeHtml(strEscapeHTML);
        System.out.println("Escaped HTML >>> " + strEscapeHTML);
        System.out.println("UnEscaped HTML >>> " + strUnEscapeHTML);
    }
}


ArrayUtils sınıfı da onlarca metod ve bunların bütün ilkel tipler ve java.lang.Object için aşırı yüklenmiş hallerini içerir. Ayrıca yine aşağıdaki xxx kısaltması bütün ilkel tipler ve Object sınıfı için kullanılmıştır. Sizin de tahmin edebileceğiz gibi bu metodlar dizi tipindeki değişkenler üzerinde yapılan çeşitli işleri kolaylaştırır.
  • add(xxx[], xxx) bir diziye yeni bir eleman ekler. Dizinin boyutunu büyüterek tabii ki
  • clone(xxx[]) dizinin kopyasını döner.
  • contains(xxx[], xxx)dizide bir eleman arar.
  • getLength(Object) dizinin eleman sayısını döner. Geçirilen referans dizi değilse, IllegalArgumentException fırlatılır.
  • hashCode(Object), equals(Object, Object), toString(Object)
  • daha önce tanıttığım metodların diziler üstünde çalışanı.
  • indexOf(xxx[], xxx) and indexOf(xxx[], xxx, int) String sınıfındaki metodlarla aynı işeve sahiptirler. Ancak diziler üzerinde çalışırlar. Ayrıca a lastIndexOf metodu da vardır.
  • isEmpty(xxx[]) dizinin boş veya null kontrolünü yapar.
  • isSameLength(xxx[], xxx[]) argümanlarındaki dizilerin aynı uzunluğa sahip olup olmadığını kontrol eder.
  • add() metodunun yanında iki tip remove metodu da vardır. İlki verilen indexteki elemanı, remove(xxx[], int), belirtilen elemanı siler, remove(xxx[], xxx).
  • reverse(xxx[]) diziyi ters çevirir.
  • subarray(xxx[], int, int) dizinin belirtilen aralıklardan bir alt dizisini oluşturup döner.
  • toObject(xxx[]) ve toPrimitive(Xxx[]) metodları ilkel tipler ile bunların sarıcıları arasında dönüşüm yapar 
ArrayUtils.toMap(Object[]) iki boyutlu dizilerden Map nesnesi oluşturur. Örneğin;

    Map colorMap = MapUtils.toMap(new String[][] {{
               {"RED", "#FF0000"},
               {"GREEN", "#00FF00"},
               {"BLUE", "#0000FF"}
    });
    

    Kolay Gelsin

    Hiç yorum yok:

    Yorum Gönder