11 Nisan 2013 Perşembe

EnumSet

Dün Enum nesnelerle ilgili araştırma yaparken karşıma çıkan bir örneği paylaşmak ve yeni java öğrenmeye çalışan arkadaşlar için de biraz araştıracağım.

Haftanın günlerini enum değerler olarak tanımladık.
Enumset'in

  • range() metodu ile Pazartesi'den Cuma'ya kadar olan enum değerlerini iş günleri değişkenine atadık.
  • alloff() metodu ise verilen  tüm enum değerli kapsıyor.
  • size() listenin kaç elemanlı olduğunu
  • removeAll() ise verilen listenin diğer enum liste içerisinden çıkarılması sağlar


isWorkday() metodumuz gelen değerin hafta içi olup olmadığını kontrol ediyor.

Bu esnada öğrendiğim bir sey daha oldu. String.format metodu. Bununla ilgili de internette araştıma yaptığımda String nesnesinin format metodunun çok güzel işler yaptığını farkettim.

Bunu bir sonraki yazımda paylaşmaya çalışacağım.


public final class EnumSetOrnegi {

  private enum HaftaninGunleri {
   PAZARTESI, SALI, CARSAMBA, PERSEMBE, CUMA, CUMARTESI, PAZAR;
EnumSet IS_GUNLERI = EnumSet.range(PAZARTESI, CUMA);

   public final boolean isWorkday() {
    return IS_GUNLERI.contains(this);
   }

   public static final EnumSet BUTUN_HAFTA = EnumSet.allOf(HaftaninGunleri.class);
  }

  public static final void main(final String... argumgents) {
   System.out.println("İş Takvimi:");

   for (final HaftaninGunleri weekday : HaftaninGunleri.BUTUN_HAFTA)
    System.out.println(String.format("%d. %s günü sen " + (weekday.isWorkday() ? "çalışmak zorundasın" : "gezip tozabilirsin") + ".", weekday.ordinal() + 1, weekday));

   System.out.println("Bütün hafta boyunca çalışmak zorunda mıyım?");
   System.out.println(HaftaninGunleri.IS_GUNLERI.containsAll(HaftaninGunleri.BUTUN_HAFTA) ? "Evet, maalesef." : "Kesinlikle hayır.");
   final EnumSet weekend = HaftaninGunleri.BUTUN_HAFTA.clone();
   weekend.removeAll(HaftaninGunleri.IS_GUNLERI);
  }
 }

Yukaridaki kodu çalıştırdığınızda çıktısı şu şekilde olacaktır :
//

İş Takvimi:
1. PAZARTESI Günü Sen çalışmak zorundasın.
2. SALI Günü Sen çalışmak zorundasın.
3. CARSAMBA Günü Sen çalışmak zorundasın.
4. PERSEMBE Günü Sen çalışmak zorundasın.
5. CUMA Günü Sen çalışmak zorundasın.
6. CUMARTESI Günü Sen gezip tozabilirsin.
7. PAZAR Günü Sen gezip tozabilirsin.
Bütün hafta boyunca çalışmak zorunda mıyım?
Kesinlikle hayır.
//

kaynak : Fun with EnumSet

10 Nisan 2013 Çarşamba

Java'da iki Enum değerini karşılaştırmak

Java'da iki Enum değeri nasıl karşılaştırsınız? "==" operatorünü mü yoksa equals() metodunu mu kullanırsınız?
İkisi arasındaki fark nedir sorusu genellikle java iş göürşmelerinde sorulabilecek hileli sorulardan birtanesidir. Eğer Java'daki Enum değerlerle ilgili ayrıntılı bilginizyoksa bunu gönül rahatlığıyla cevaplamaya çekinirsiniz.

Enum nesneler String nesnelerin tersine == ve equals() metoduyla karşılaştırılabilirler. İkisi de aynı sonucu döndüreceklerdir. Çünkü Java.lang.Enum'ın equals() metodu içerisinde == ifadesini kullanır iki nesneyi karşılaştırırken.

Enum equals() metodu;

public final boolean equals(Object other) {
        return this==other;
}


1) Enum Karşılaştırma işlemini == ile yaptığınızda NullPointerException hatası almazsınız. Değerlerden biri null olsa bile sonuç olarak size false döndürecektir. Aynı işlemi equals() metodu ile yapmak istediğiniz de NullPointerException hatası alırsınız.

private enum Shape{
        RECTANGLE, SQUARE, CIRCLE, TRIANGLE;
} 

private enum Status{
        ON, OFF;
}

Shape unknown = null;
Shape circle = Shape.CIRCLE;      

boolean result = unknown == circle; //return false
result = unknown.equals(circle); //throws NullPointerException

2) == kullanmanın diğer avantajlarından birisi de Derleme (compile) esnasında güvenli olması. Derleme esnasında iki enum nesnesinin aynı enum tipinde olup olmadığını ya da eşitliğini kendi kendine kontrol eder.

3) == operatoru equals() metodundan daha hızlıdır. Operator kullanmak method çağırmaktan çok daha hızlı olmalı, değil mi.

compareTo metodu ile Enumları karşılaştırma
İki Enum'ı karşılaştırmak demek herzaman o iki Enum'ın eşit olup olmadığını kontrol etmek değildir. Bazen onları sorlamak ve belli bir sıraya koymayı da isteyebilirsiniz. Biliyoruz ki, Java'daki Comparable and Comparator sınıflarını kullanarak nesneleri karşılaştırabilir ya da sıraya koyabiliriz. Enum'ı da aynı şekilde elealabiliriz.

Java.lang.Enum sınıfımızı Comparable arayüz (interface'den) implements edebiliriz. Bildiğiniz gibi  compareTo() metodu sadece aynı tip nesneleri kıyaslar.
Aynı sıralama işlemini Enum'ın ordinal() metodu,  EnumSet ve EnumMap ilede yapabilirsiniz.

public final int compareTo(E o) {
 Enum other = (Enum)o;
 Enum self = this;

 if (self.getClass() != other.getClass() && // optimization
  self.getDeclaringClass() != other.getDeclaringClass()) throw new ClassCastException();

return self.ordinal - other.ordinal;
}

Eğer son satıra bakarsanız karşılaştırma için ordinal metodunun kullanıldığını görürsünüz.


Kaynak: http://javarevisited.blogspot.com/2013/04/how-to-compare-two-enum-in-java-equals.html#ixzz2Q4PBHXds

27 Aralık 2012 Perşembe

Android Notlarım-1

Bu döküman sadece Android çalışırken almış olduğum notları içermektedir.

Arayüzlerle ilgili işlemler "res/layout" altındaki xml'lerle yapılıyor. Bir android projesi oluşturduğunuzda otomatik olarak oluşan "activity-main.xml" dosyasına bakabilirsiniz.

Layout olarak birkaç çeşit mevcut fakat default olarak "RaletiveLayout" geliyor. Bu seçildiğinde tüm nesnelerinin uzunlukları başlangıç bitiş noktaları birbiriyle bağımlı olmaktadır. İstediğiniz gibi çekip çekiştiremiyorsunuz. O yüzden benim tercihimi "LinearLayout" tarafında kullanıyorum.

xml  = butonlar, textler,vs.
res/values/string.xml = message bundle gibi dil desteğini sağlayan dosyadır. Xml'deki "android:text="@string/button_send"
button_send idsinin yerine string xml'deki değeri yazacaktır.

Activity : Programın gerçekleştirdiği işlemlerin yapıldığı yerdir. Action claslarının yaptığı gibi. Her yeni arayüz aynı zamanda yeni bir activity demektir.

Intent : kelime anlamı olarak " birşeyi yapmaya istekli olmak"
putExtra() metodu bir key ve bir value alır. Çeşitli tiplerdeki veriyi bir collection içinde taşıyabilir.

Bir activityî başlatmak için startActivity() metodunu çağırmalısınız.

Androiddeki bir Activity'nin yaşam döngüsü çok kısadır. Bu sebeple belirli aralıklarla kullanıcının attığı her adımda yapılması, çağırılması gereken metodlar vardır.



Resumed : Bu durumda Activity önplandadır ve kullanıcı istediği an etkileşimde bulunabilir.
Paused : Activity durdurulur ve herhangi bir işlem yapmaz.
Stopped : Bu durumda Activity tamamen saklanır ve kullanıcıya görünmez. Arka planda olarak kabul edilir ve hiçbir kod çalışmaz.

onCreate() metodu : Kullanıcı ekrandan sizin programın ikonuna tıkladığında sistem onCreate() metodunu çağırıyor. Android Manifesto dosyasındaki Luncher kısmına tanımladığınız class'ın onCreate() metodunu

onCreate() > onStart()  and onResume()

ufak bir not : Bütün metodlarda ilk önce super class'ların metodları çağrılır.
"super.onStart();"

Varolan durumu korumak için saveInstanceState() metodunu kullanıyoruz.


25 Aralık 2012 Salı

ArrayList'teki çift kaydı silmek

Düşünüldüğünden çok daha basit bir yolu var.

Nasıl mı?
ArrayList'inizi HashSet'e çevirebilirsiniz.

Sıralı & çift kayıt içeren listemiz:
List<String> siraliArrayList= (List<String>) Arrays.asList("Android" , "Android""iOS""Windows mobile");

HashSet aşağıdaki çevirme (convert) işlemi ile çift kayıtları silerek yeni bir liste oluşturmuş oluyoruz.
HashSet<String> listToSet = new HashSet<String>(siraliArrayList);

sıraliArrayList isimli listemizin boyutu(size) 4 iken convert ettiğimiz "listToSet" listemizin boyutu 3 olacaktır. Bunun nedeni ise "Android" çift kayıtlardan bir diğerinin silinmesidir.

İkisinin arasındaki fark, Hashset sıralı listedeki sırayı dikkate almayacaktır.

Yani iki listenin de çıktısını almak istediğimiz de:

siraliArrayList için : [Android, Android, iOS, Windows mobile], size : 4
listToSet için : [iOS, Android, Windows mobile], size : 3, Bambaşka bir düzende getirebilir.

Eğer sıralamanın korunmasını ve çift kaydın silinmesini istiyorsanız HashSet yerine LinkedHashSet kullanmalısınız.

____

21 Aralık 2012 Cuma

String isEmpty() metodu


Java 6'dan önce bir String değerin boş olup olmadığını iki şekilde kontrol edebiliyorduk.

1. if(string != null && string.length() == 0) // null değilse ve uzunluğu 0'sa içerik boştur.
2. if(("").equals(string)) // string boş değere eşitse içerik boştur.

Java 6'da string classlar için isEmpty() metodu bulunmaktadır ve boolean bir değer bulundurmaktadır.

boolean isEmpty()

string.isEmpty() dediğinizde ya true bir değer döndürürse bunun anlamı string değerin uzunluğunun "0-sıfır" olduğudur. Yani değer boştur.

bir string'in boş olup olmadığını isEmpty() metodunu kullanarak kontrol ettiğinizde diğer yollara istinaden daha hızlı bir işlem yapmış olacaksınız.

Örnek : 

if(string.isEmpty())
   System.out.println("içerik boş");
else
   System.out.println("içerik dolu");

13 Aralık 2012 Perşembe

method ve constructor arasındaki fark


method ve constructor arasındaki fark nedir?

Constructor ve method arasında ana fark methodu açık bir şekilde/ doğrudan çağırmanız gerekirken, constructor'ı nesne oluşturuken dolaylı olarak çağırırsınız. Bunun anlamı Costructor'ın çağrılamayacağı değildir. Eğer "overloaded constructor (aynı class içinde birden fazla constructor-yapıcı- olması)"ınız varsa "this" anahtar kelimseni kullanarak onları çağırabilirsiniz. "super" anahtarını kullanarak super class'ın yapıcısını da çağırabilirsiniz. Eğer herhangi bir çağırma işlemi yapmazsanız Java derleyicisi tarafından bu işlem otomatik olarak yapılıyor. Bu işleme javada "constructor chaning-yapıcı zincirleme" deniliyor.

Benzerlikler :

1) İkisi de overloaded (aynı isimde birden fazla metod)veya overridden(tekrar yazılabilir -@override annotation'ını kullanır)

2) Constructor'ı public, protected, private tiplerinde yapabilirsin, method gibi.

Farklılıklar :

1) İlk farklılık, Constructor ismi içinde Class ismi ile aynı olmalıdır. Method'da ise böyle bir zorunluluk yoktur. Method'a istediğiniz herhangi bir isim verebilirsiniz.

2) Constructor herhangi bir type sahip olmadığı için geriye bir type döndürmez. Method ise istenilen type (String, BigDecimal ..vs) döndürebilir.

3) Constructor'lar zincirleme olarak çağrılabilir methodlarda böyle bir yapı yoktur.

4) Method'ların aksine, Constructor'lar alt classlar tarafından miras alınamazlar. Methodlar ise tipi "private" değilse miras alınabilirler. private Constructor'ın anlamı dışardan bşaka bir class'ın nesne oluşturmasını engellemektir. Bu ise Singleton pattern'in teknik özelliklerinden biridir.

5) Costructor'ı doğrudan çağırmak için "this" ve "super" kelimelerini kullanırsınız, method'da ise böyle birşey yok.

Daha ayrıntılı bilgi almak için aşağıdaki kaynağı kullanabilirsiniz.

Kaynak: Difference between method and constructor in Java

9 Kasım 2012 Cuma

iReport'ta null yerine bigdecimal.zero atamak

iReportta "Blank When Null" seçeneğini seçersek  eğer değer null ise ilgili alan boş gelecektir. Seçmezsek "null" diye yazacaktır.

bu iki seceneğin yerine farklı bir değer gelmesini istiyorsanız ilgili alan üzerinde farklı bir işlem yapmanız gerekecektir.

İlgili alan üzerine tıkladınız ki bu benim için BigDecimal bir alan olacaktır. properties'den "Text Field Expression" ı seçiyoruz. açılan ekranda alanın içindeki parameter görünecektir.

$F{maas} --> ($F{maas} !=null) ? $F{maas} : new BigDecimal("0.00")

aynı işlemi xml tarafında da yapabilirsiniz.

xml tarafındaki görünümü ise şu şekildekir:
#<![CDATA[($F{maas}!=null)?$F{maas}:new BigDecimal("0")]]>

Yaptığımız işlemle eğer parametre üzerinde bir deger varsa ilgili "maas" değeri gelecek, null ise "0.00" değeri gelecektir.

Bu metodu String değerler içinde kullanabilirsiniz.