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.





11 Ekim 2012 Perşembe

EnumMap nedir? EnumMap Kullanımı

EnumMap JDK 5 sürümüyle gelen bir özellik. Diger Map'ler gibi işlemekte fakat key olarak enum değer almaktadır.
.equals() ve .hashCode() metodlarını override edebiliyorsunuz.

Enummap'in önemli noktaları :
1) kullanılan bütün keyler aynı enum tipinde olmalı
2) Null bir enum key ekleyemezsin, buna izin vermez ve NullPointerException fırlatır.  fakat null value ekleyebilirsin.
3) EnumMap synchronized değildir. manuel olarak synchronized edilmesi gerekmektedir, istenildiği takdirde.
4) Eğer datanız enum tipinde ise EnumMap kullanmanız performans açısından HashMap kullanmaktan daha iyi sonuç verecekir.

Java'da EnumMap nasıl kullanılır


import java.util.EnumMap;
import java.util.Iterator;

/**
 * Java program to demonstrate How to use EnumMap in Java
 * If Key Object is Enum than it’s best to EnumMap to get better performance.
 * Most of IDE like Netbeans and Eclipse suggest you to use EnumMap instead of HashMap
 * or any other Map implementation when key object is Enum.
 *
 * @author Javarevisited
 */

public class EnumMapExample{

    public enum STATE{
        NEW, RUNNING, WAITING, FINISHED;
    }

    public static void main(String args[]) {
    
        // Java EnumMap Ornek 1: STATE enum tipinde, key'le enumMap yaratma
        EnumMap stateMap = new EnumMap(STATE.class);
    
        // Java EnumMap Örnek 2:
        //EnumMap'in içine degerleri yerleştirme
        //Girilen sıralamadan farklı olarak enum key'leri ekliyoruz. Sıralama "  NEW, RUNNING, WAITING, FINISHED"
    // yukarıda girilen sıranın bir önemi yok
        stateMap.put(STATE.RUNNING, "Program is running");
        stateMap.put(STATE.WAITING, "Program is waiting");
        stateMap.put(STATE.NEW, "Program has just created");
        stateMap.put(STATE.FINISHED, "Program has finished");
    
        // Java EnumMap Örnek 3:
        //EnumMap'in boyutunu yazdırma
        System.out.println("EnumMap'in boyutu: " + stateMap.size());
    
        // Java EnumMap Örnek 4:
        //İlk tanımlanan sıralamayla gelecek şekilde enum değerleri yazdırmak
        System.out.println("EnumMap: " + stateMap);
    
        // Java EnumMap Örnek 5:
        //Map'ten değer (value) almak
        System.out.println("EnumMap key : " + STATE.NEW +" value: " + stateMap.get(STATE.NEW));
    
        // Java EnumMap Örnek 6:
        //Iteratokullanma
        Iterator enumKeySet = stateMap.keySet().iterator();
        while(enumKeySet.hasNext()){
            STATE currentState = enumKeySet.next();
            System.out.println("key : " + currentState + " value : " + stateMap.get(currentState));
        }
    
        //Java EnumMap Örnek 7:
    //EnumMap'in verilen anahyatı içerip içermediği kontrol ediliyor
        System.out.println("State bu key'e sahip mi :" + STATE.NEW + " : "
                            +  stateMap.containsKey(STATE.NEW));
    
        //Java EnumMap Example 8: Verilen değer'e (value) sahip mi?
        System.out.println("Değer var mı :" + STATE.NEW + " : " + stateMap.containsValue(null));

    }

}


Çıktı:
Örnek 3 : 
EnumMap'in boyutu: 4

Örnek 4 : 
EnumMap: {NEW=Program has just created, RUNNING=Program is running, WAITING=Program is waiting, FINISHED=Program has finished}

Örnek 5 : 
EnumMap key : NEW value: Program has just created

Örnek 6 : 
key : NEW value : Program has just created
key : RUNNING value : Program is running
key : WAITING value : Program is waiting
key : FINISHED value : Program has finished

Örnek 7 :
State bu key'e sahip mi  :NEW : true

Örnek 8 :
Değer var mı :NEW : false

------
kaynak : http://javarevisited.blogspot.sg

8 Ekim 2012 Pazartesi

Ubuntu'dan postgresql-8.4'ü tamamen kaldırmak

remove komutu postgresql sistemdem tamamen kaldırmıyor.
Bu yüzen şöyle bir yol izlemem gerekti;

sudo apt-get --purge remove postgresql-8.4 postgresql-client-8.4 postgresql-contrib-8.4

 eğer hangi dosyaları kaldıracağınızı bilmiyorsanız
sudo apt-get --purge remove postgresql-* da diyebilirsiniz.

devamında ise, postgres'in kurulduğu dizinlerideki dosyları da silelim. Aslında diğer versiyonlar için de aynı yolu izleyebilirsiniz

sudo rm -rf /var/lib/postgresql/ 
sudo rm -rf /etc/postgresql/
sudo rm -rf /var/log/postgresql/

Ubuntu 12.04'te postgresql yüklemek

Postgres bütün işletim sistemlerinde (Linux, UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64) çalışan bir veritabanı sistemidir.
ayrıca bütün program dilleri (C/C++, Java, .Net, Perl, Python, Ruby, Tcl, ODBC, ve digerleri) için de bir arayüze sahiptir.

postgresql yüklemek (install) etmek için :

son versiyon için;
sudo apt-get install postgresql postgresql-client postgresql-client-common postgresql-common  postgresql-contrib

herhangi bir versiyonu yüklemek istiyorsanız;
sudo apt-get install postgresql-8.4 postgresql-client-8.4  postgresql-contrib-8.4

Ben 8.4 versiyonunu kuracağım için 8.4 üzerinden anlatacağım;

Ubuntu kullandığım için postgres'i "/etc/" altına kuruyor. Ve ".conf" dosyalarını "/etc/postgresql/8.4/main/" altında bulabiliriz.

.conf uzantılı dosyaları açmak için ise terminal'den "sudo gedit /etc/postgresql/8.4/main/postgresql.conf" komutunu kullanabiliriz. Buradaki gedit text program adıdır.
user oluşturmak için :

sudo su postgres -c psql template1
postgres=# ALTER USER postgres WITH PASSWORD 'postgres';
postgres=# \q

\q : quit demek

Ubuntudaki postgres kullanıcısının şifresini değiştirmek için, yukarıda girdiğiniz şifreyi giriniz. Bu şifreler aynı zamanda Java'da bulunan *-ds.xml deki ayarlara girilen kullanıcı adı ve şifre ile aynı olmalı :

sudo passwd -d postgres
sudo su postgres -c passwd

Enter new UNIX password:
Retype new UNIX password:

sıra ".conf dosyalarını düzenlemeye geldi.
veritabanınıza ulaşacak kişilere izin vermek için aşağıdaki dosyayı düzenlemeniz gerekmektedir. kimseye bir izin vermeyecekseniz zaten olması gereken değerle default olarak geliyor.
sudo gedit /etc/postgresql/8.4/main/pg_hba.conf

asıl düzenlenmesi gereken dosya aşağıdaki dosyadır. Dosyayı gedit programi ile acabileceğiniz gibi normal yollardan da açabilirsiniz.

sudo gedit /etc/postgresql/8.4/main/postgresql.conf

#listen_addresses = 'localhost'
değerini aşağidaki şekilde değiştirelim, yani # işaretini kaldıralım ki aktif olsun.

listen_addresses = '*'

* = All demek, isterseniz default degeriyle de kalabilir.

bir de

#password_encryption = on
değerini
password_encryption = on

olarak değiştirip kaydedip kapatın.

* yapılan değişikliklerden sonra postgres'i reload etmek için
sudo service postgresql-8.4 reload

* restartetmek için
sudo   service postgresql-8.4 restart
veya
sudo /etc/init.d/postgresql-8.4 restart

pgAdmin III programınızdan yeni vertabanınızı ekleyebilir, restore ve drop edebilirsiniz. Aynı işlemleri terminalden de yapabilirsiniz tabi ki.

26 Temmuz 2012 Perşembe

net.sf.jasperreports.engine.JRRuntimeException: Subreport overflowed on a band that does not support overflow.

iReport kullanıyorsanız ve aşağıdaki hatayı alıyorsanız;

net.sf.jasperreports.engine.JRRuntimeException: Subreport overflowed on a band that does not support overflow.

bu hatanın sebebi, sayfanızın herhangi bir bolumune koymuş olduğunuz subreport'tan kaynaklanmaktadır. Neden mi? Çünkü, subreport'u ana jrxml'a yerleştirdiniz diyelim, eğer bölümün yüksekliği subreport içeriği dolduktan sonra  küçük geliyorsa böyle bir hata alıyorsunuz.

Daha net açıklamak gerekiyorse;

Sayfamın page footer'ına bir subreport yerleştirdim. bunun orjinal yüksekliği belki 200, ama ben ana jrxml'deki yüksekliği 100 bırakmışım. Bu durumda jrxml'leriniz compile olmuyor.

1. Ya subreportunuz büyüyebilir olmayacak
2. ya da ana jrxml'deki ilgili kısmın boyutunu yükselteceksiniz.

4 Temmuz 2012 Çarşamba

Hibernate'te kolay sorgu yazma (Example.create)


Hibernate'e elimiz değmişken biraz daha karıştırayım dedim.
Şöyle bir güzellik ve kolaylık gördüm.

Yeni bir instance yaratıyorsunuz ve istediğiniz özellikleri set ediyorsunuz. Example.create(X) X yerine ilgili instance'ı veriyorsunuz. ve listeme işlemi gerçekleşiyor.

Tek tek Restrictions.eq("name", "Mavis").add(....).list() diye yazmaktansa bu daha kolay.

Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)     .add( Example.create(cat) )     .list();


Sorgu, cinsiyeti dişi ve rengi siyah olan kedileri listeleyecek.

kaynak sayfa: http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/querycriteria.html

3 Temmuz 2012 Salı

Hibernate'de çoklu kriter oluşturmak (Multiple OR, Hibernate Criteria Expression Or)

http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/querycriteria.html

"Restrictions.or"u çoklu bir şekilde kullanmak istedik, fakat aklımıza gelmedi, derken araştırdım buldum. Yukarıda link'ten ilgili sayfaya gidebilirsiniz.

//Normal Or kullanımı
aşağıdaki sorgu ismi Fritz'le başlayan ve yaşı null olmayan veya 0 olanları listeleyecek.

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.or(
        Restrictions.eq( "age", new Integer(0) ),
        Restrictions.isNull("age")
    ) )
    .list();
 
Çoklu Or kullanımı için ise Restrictions.disjunction() 'ı kullanabilirsiniz.
 
List cats = sess.createCriteria(Cat.class)
      //ismi listenin içinde varolanlar
    .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) ) 
 //ve yaşı null olmayan veya 0 veya 1 veya 3 olanlar
     .add( Restrictions.disjunction()
        .add( Restrictions.isNull("age") )
        .add( Restrictions.eq("age", new Integer(0) ) )
        .add( Restrictions.eq("age", new Integer(1) ) )
        .add( Restrictions.eq("age", new Integer(2) ) )
    ) )
    .list(); 

4 Haziran 2012 Pazartesi

Java'da String ve StringBuffer/StringBuilder arasındaki fark

Java'da String ve StringBuffer/StringBuilder arasındaki en önemli fark : String objesi değiştirilemezken StringBuffer/StringBuilder objelerinin değiştirilebilir olmasıdır.

String objenin içine saklanan değer değiştirilemez. Peki nasıl oluyor da ben istediğim zaman string bir değişkeni değiştirebiliyorum diye sorabilirsiniz. Sizin görmüş olduğunuz nesene aynı nesne değildir. String objesi değişmek için arka planda yeni bir String nesnesi oluşturur. Her değişikilte yeni bir String class'ı oluşuyor. Bu da zamanla performansı kötü yönde etkiliyor.

StringBuffer/StringBuilder objelerini kullanırsanız performan açısından daha iyi sonuçlar elde edersiniz. Çünkü Objenin içinde saklanan değer değiştirilebilir bir değerdir.

StringBuffer ile StringBuilder arasında ki tek fark ise "senkronizasyon"dur.
StringBuffer "synchronized" iken StringBuilder "synchronized" değildir.

Thread kullancaksanız; StringBuffer, kullanmayacaksanız StringBuilder kullanmanız daha verimli olcaktır.

Kaynak: http://www.techtamasha.com/difference-between-string-and-stringbufferstringbuilder-in-java/28

1 Haziran 2012 Cuma

Java'da hızlı method oluşturmak (Extract Method)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." Martin Fowler

Biliyorum, java da method oluşturmayı bu alandaki herkes biliyordur. Bilmiyorsa da henüz yolun başındadır. İlk java öğrenmeye başladığımda kod yazıyordum fakat bir metod nasıl oluşturulur, metoda parametre nasıl verilir bilmiyordum. Gözümde büyüttüğüm kadar da değilmiş. Henüz emekliyordum çünkü.
Metod nasıl yazılır, parametre nasıl gönderilir öğrendim çok geçmeden. Ama bundan birkaç ay öncesine kadar hızlı bir şekilde nasıl metod oluşturulur, Proje Müdürümüz Çağrı Bey'den öğrendim.

Özellikle refactor yaparken çok hızlı ve güvenilir bir yol "Extract Method" seçeneği.

Tek yapmanız gereken önceden yazmış olduğunuz kodu (metod olacak) seçiniz ve sağ tıklayınız. Refactor > Extract Method
gelen ekranana metod ismini yazıyorsunuz ve Tamam diyorsunuz. Metod oluştu hem de ne cinsinden deger döndüreceğini de kendisi ayarlayarak.

Bu yöntem son zamanlarda refactor yaparken çok fazla işimi kolaylaştıran bir yol.

Local Variable oluşturmak
Bunların yanında aynı class'ın bir degerini sürekli süreli "x.getZzz()" diyerek almaktansa hızlı bir şekilde local variable oluşturmakta işimi bir hayli kolaylaştırıyor. Bunu da aynı şekilde Refactor seçeneğindeki local variable'ı seçip, eğer programın sizin için vermiş olduğu isimlendirmeyi beğenmediyseniz yeni bir isim vererek yeni bir yerel değişken oluşturabilirsiniz.

Umarım bu bilgi işinize yarar. Paylaşmak istedim.

17 Mayıs 2012 Perşembe

Java'da herhangi bir dosya nasıl byte'a çevrilir? (how to convert a file to byte array)

//Dosyanın yolu verilir ve yeni bir file elde edilir
   File file = new File(".././dosyaAdi.xls");

   FileInputStream fis = new FileInputStream(file);
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   byte[] buf = new byte[1024];
   try {
    for (int readNum; (readNum = fis.read(buf)) != -1;) {
     bos.write(buf, 0, readNum); // no doubt here is 0
    }
   } catch (IOException ex) {
    throw new java.lang.IllegalStateException("Hatalı içerik!");
   }
   
   byte[] byteFile = bos.toByteArray();

11 Mayıs 2012 Cuma

List ve Set arasındaki fark

Bildiğimiz gibi elma ve armut bir birinden çoook farklı iki meyvedir. :) Bugün bahsedeceğim başlığın konusu bildiğim ama benim bazen "acaba hangisiydi!" dediğim bir konu aslında. Bir daha unutmamak adına bu bloga yazmaya karar verdim. Aslında çok basit: Her nesneyi eklemek istiyorsanız List'i, her aynı nesneden sadece birini eklemek istiyorsanız Set'i kullanıyoruz. Örnekle açıklayacak olursak,


public static void main(String[] args) {
  List stringList = new ArrayList();
  stringList.add("aaa");
  stringList.add("aaa");
  stringList.add("bb");
  stringList.add("cc");
  System.out.println("String List :" + stringList.toString());
  
  Set stringSet = new HashSet();
  stringSet.add("aaa");
  stringSet.add("aaa");
  stringSet.add("bb");
  stringSet.add("cc");
  System.out.println("String Set :"+ stringSet.toString());
 }


Bunu çalıştırdığımda çıktı aşağıdaki gibi olacaktır.

String List : [aaa, aaa, bb, cc]
String Set : [aaa, bb, cc] 
Eğer listenizi List tipinden oluşturursanız, içine eklediğiniz tüm String tipindeki nesneleri kabul edecektir. Ama listenizin içinde her birinden bir tane olacak şekilde nesneler bulunsun istiyorsanız o zaman Set kullanmanızı öneririm.