Burak IŞIKLI :))

Java Bean

Posted in Java by Burak IŞIKLI on 21 Haziran 2009

Java Bean’ler reusable(yeniden kullanılabilir) yazılım bileşenidir. Java Bean’ler bir serializable(serileştirebilir), herhangi bir argümanı olmayan constructor’a sahip ve getter-setter metodunun kullanıldığı java objesidir. Bunun için bazı şartları sağlaması gerekmektedir:

* Sınıfın public default constructor’ı olmalıdır.
* Sınıf properties(özellikleri) set-get metodlarını kullanarak erişilmelidir.
* Sınıf serializable(serileştirebilir) olmalıdır.

Java Bean’ler Enterprise Java Bean’lerden farklıdır, karıştırılmamalıdır.

PersonBean.java

package edu.burakkk.bean;
import java.io.Serializable;

/**
 * Java Bean
 *
 *@version 1.0 Release 1
 *@author Burak ISIKLI
 *
 **/

public class Bean implements Serializable {
 static final long serialVersionUID = 102755394728345L;
 private String name;
 private boolean happiness;

 /** No-arg constructor (takes no arguments). */
 public Bean() {
 }

 public String getName() {
 return this.name;
 }
 public void setName(final String name) {
 this.name = name;
 }

 public boolean isHappiness() {
 return this.happiness;
 }
 public void setHappiness(final boolean happiness) {
 this.happiness = happiness;
 }
}

TestPersonBean.java

package edu.burakkk.bean;

public class TestBean {
 public static void main(String[] args) {
 Bean person = new Bean();
 person.setName("Burakkk");
 person.setHappiness(true);

 // Output: "Burakkk [Mutlu]"
 System.out.print(person.getName());
 System.out.println(person.isHappiness() ? " [Mutlu]" : " [Mutlu Değil]");
 }
}

testPersonBean.jsp

<% // Use of PersonBean in a JSP. %>
<jsp:useBean id="person" scope="page"/>
<jsp:setProperty name="person" property="*"/>

<html>
<body>
Isim: <jsp:getProperty name="person" property="name"/>
Secenek: <jsp:getProperty name="person" property="happiness" />

<form name="beanTest" method="POST" action="testPersonBean.jsp">
Isim: <input type="text" name="name" size="50">
Secenek:
<select name="happiness">
 <option value="false">Mutlu</option>
 <option value="true">Mutlu Degil</option>
</select>
<input type="submit" value="Test et">
</form>
</body>
</html>

Bu örnekte isminizi ve mutlu olup olmadığınızı soran bir java bean yaptık. Bu java bean’i hem java’da derleyerek hem de jsp aracılığıyla ulaşabiliriz. Java’da derlediğiniz takdirde “Burakkk [Mutlu]” ekranda yazacaktır. JSP’de ise bir form ekrana gelerek form girdiğimiz değerlerle sayfayı sürekli güncelleyecektir.

Kaynaklar:

http://en.wikipedia.org/wiki/JavaBeans

http://java.sun.com/docs/books/tutorial/javabeans/whatis/index.html

http://www.roseindia.net/ejb/introduction/javabean.shtml

Reklamlar
Tagged with: , ,

Design Patterns(Tasarım Şablonları)-1

Posted in Java by Burak IŞIKLI on 18 Haziran 2009

Yazılım esnasında tekrar eden sorunları çözmek için kullanılan ve tekrar kullanilabilir tipte kod yazılımını destekleyen bir ya da birden fazla sınıftan oluşmuş modül ve program parçalarına Tasarım Şablonu denir. Tasarım şablonları, programcılar tarafından edindikleri tecrübeler doğrultusunda oluşmuş kalıplardır. Bu kalıplar sorunu tanımlıyarak, çözümü için gerekli atılması gereken adımlari ihtiva ederler. Kullanıcı kalıbı, tanımlanmış sorunu çözmek için tekrar tekeri icat etmek zorunda kalmadan kullanabilir.

Tasarım şablonları aşağıda yeralan ortak özelliklere sahiptir:

  • Edinilen tecrübeler sonunda ortaya çıkmışlardır.
  • Tekerin tekrar icat edilmesini önlerler.
  • Tekrar kullanılabilir kalıplardır.
  • Ortak kullanılarak daha büyük problemlerin çözülmesine katkı sağlarlar.
  • Devamlı geliştirilerek, genel bir çözüm olmaları için çaba sarfedilir.

Program bakımı ve geliştirilmesi için ilk yazılım sürecinden daha çok enerji sarfedilir. Bu yüzden yazılım esnasında esnek bir yapının ve mimarinin oluşturulmasına dikkat edilmesi gerekmektedir. Esnek mimariler için değişik türde tasarım şablonları kullanılabilir. En basit ve uygulaması kolay bir tasarım şablonunun kullanılması, hiçbir tasarım şablonunun kullanılmamasından daha iyidir. İyi bir yazılım mühendisi olabilmek için tasarım şablonları ve kullanım alanları hakkında ihtisas yapmış olmak gerekmektedir.

Tasarım şablonları değişik kategorilere ayrılır. Bunlar:

  • Oluşturucu tasarım şablonları (creational patterns)
  • Yapısal tasarım şablonları (structual patterns)
  • Davranışsal tasarım şablonlar (behavioral patterns)
Oluşturucu Yapısal Davranışsal
– Abstract Factory (soyut fabrika)

– Builder (inşaatçi)

– Factory Method (fabrika)

– Prototype  (prototip)

– Singleton (yalnızlık)

– Adapter

– Bridge (köprü)

– Facade (cephe)

– Decorator (dekotatör)

– Composite (kompozit)

– Flyweight (sinek siklet)

– Proxy (vekil)

– Command (komut)

– Memento (hatıra)

– Strategy (strateji)

– Iterator (tekrarlayıcı)

– State (durum)

– Chain Of Responsibility (sorumluluk zinciri)

– Mediator (aracı)

– Observer (gözlemci)

– Template Method (şablon metot)

– Visitor (ziyaretçi)

1-) SINGLETON PATTERN(YALNIZLIK TASARIM ŞABLONU)

Bazı durumlarda bir sınıftan sadece bir nesnenin oluşturulması ve oluşturulan bu nesnenin tüm sistemde kullanılması gerekebilir. Örneğin bilgibankası için bir connection pool (bilgibankası bağlantı havuzu) sadece bir defa oluşturulmalı ve kullanılmalıdır veya oluşturulacak properties nesnesinin bir kere ve proses(process) çalışmaya başladığı anda(constructor) oluşturulmalıdır. Bu durumda Singleton tasarım şablonu kullanılarak, bir sınıftan sadece bir nesnenin oluşturulması sağlanabilir.

Singleton Pattern UML Diagram

Singleton tasarım şablonunu iki farklı yöntemle yapabiliriz. Yapacağımız değişiklik senkronizasyonu yapacağımız aracı değiştirmektir. Senkronizasyonu kilit objesiyle veya komple sınıfı kilitleyerek yapabiliriz.

Bir singleton sınıfın taşıması gereken bazı özellikler vardır. Bunlar:
·Sınıf konstruktörlerinin(constructor) private olması gerekiyor. Konstruktörleri private olan bir sınıftan, başka bir sınıf new operatörü ile nesne oluşturamaz.
·Singleton sınıfından sadece bir tane nesne oluşturulması gerektiği için, oluşturulması gereken nesneyi sınıfın static değişkeni olarak tanımlamamız gerekiyor. Örnekte “private static Singleton instance = null” şeklinde bu tanımlamayı yapıyoruz.
·Singleton sınıfında instance() isminde static bir metodun olması ve bu metodun static olarak tanımlanmış nesneyi geri vermesi gerekiyor. instance() metodu içinde sınıfın tek nesnesi olacak değişken oluşturulur.

Singleton.java


package edu.burakkk.patterns.singleton;

/**
 * Singleton Pattern(Yalnızlık Tasarım Şablonu) 
 * Yaratılacak objelerin bir sefer yaratılıp 
 * aynı objenin birden fazla yerde yeniden 
 * yaratılmadan kullanılmasını sağlar
 * Singleton Sınıfı
 * 
 *@version 1.0 Release 1
 *@author Burak ISIKLI
 *@date June 18, 2009
 * 
 **/
public class Singleton {
 /*
 * Singleton sinifindan olusturulabilecek tek nesne static sinif degiskeni
 * olarak tanimlaniyor.
 */
 private static volatile Singleton instance = null;

 /*
 * Sınıf yerine kullanılacak obje tanımı(synchronized(lock)) Double check
 * locking yapabilmek icin kullanilan nesne. private static Object lock =
 * new Object();
 * 
 * 
 * * Baska siniflarin new Singleton() seklinde nesne olusturmalarini, sinif
 * konstruktorünü private yaparak engellemis oluyoruz.
 */
 private Singleton() {
 System.out.println("Constructor");
 }

 /**
 * Singleton sinifindan olusturulabilen tek nesneye ulasmak icin instance()
 * metodu kullanilir.
 * 
 * @return Singleton static Singleton nesnesi
 */
 public static Singleton getInstance() {
 if (instance == null) {
 // Double checked locking
 synchronized (Singleton.class) {
 if (instance == null) {
 instance = new Singleton();
 }
 }
 }
 return instance;
 }

 /**
 * Singleton sinifinda bulunan bir metod. Buraya kendi metotlarınızı
 * ekleyebilirsiniz
 */
 public void printIt() {
 System.out.println(this);
 }
}

Main.java


package edu.burakkk.patterns.singleton;

/**
 * Singleton Pattern(Yalnızlık Tasarım Şablonu) 
 * Yaratılacak objelerin bir sefer yaratılıp 
 * aynı objenin birden fazla yerde yeniden 
 * yaratılmadan kullanılmasını sağlar
 * Main Sınıfı
 * 
 *@version 1.0 Release 1
 *@author Burak ISIKLI
 *@date June 18, 2009
 * 
 **/

public class Main {
 public static void main(String[] args) {
 Singleton.getInstance().printIt();
 }
}

Main sınıfımızı çalıştırdığımızda ekrana şunlar gelecektir:

Constructor
edu.burakkk.patterns.singleton.Singleton@9304b1

Yukarıda yazdığımız kod ise multithread’e karşı güvenli bir koddur. Yine de bunu test etmek için de bir sınıf oluşturalım:

Test.java


package edu.burakkk.patterns.singleton;

/**
* Singleton Pattern(Yalnızlık Tasarım Şablonu) 
 * Yaratılacak objelerin bir sefer yaratılıp 
 * aynı objenin birden fazla yerde yeniden 
 * yaratılmadan kullanılmasını sağlar
 * MultiThread Test Sınıfı
 * 
 *@version 1.0 Release 1
 *@author Burak ISIKLI
 *@date June 18, 2009
 * 
 **/

public class Test {
 private static Singleton singletona, singletonb;
 public static void main(String[] args) {
 // getInstance() iki ayrı thread ile çağırılsın.
 Thread threada = new Thread() {
 @Override
 public void run() {
 singletona = Singleton.getInstance();
 }
 };
 threada.start();

 Thread threadb = new Thread() {
 @Override
 public void run() {
 singletonb = Singleton.getInstance();
 }
 };
 threadb.start();

 // Her iki thread tamamlanana kadar beklensin
 while (!(threada.getState() == Thread.State.TERMINATED && threadb
 .getState() == Thread.State.TERMINATED))
 ;

 System.out.println(singletona == singletonb);
 }
}

Eğer test başarılı olursa ekran çıktısı şu şekilde olacaktır:

Constructor
true

Notlar:

Abstract Factory, Builder ve Prototype tasarım şablonlarında olabileceği gibi birçok tasarım şablonu Singleton tasarım şablonu kullanılarak implemente edilir.

Facade objeleri genellik Singleton’dır çünkü sadece bir tane Facade objesi gereklidir.

State(Durum) objeleri genellikle Singleton’dır.

Daha detaylı bilgi için:

http://www.ibm.com/developerworks/library/j-dcl.html

http://www.kurumsaljava.com

package edu.burakkk.patterns.singleton;

/**
* Singleton Pattern(Yalnızlık Tasarım Şablonu)
* Yaratılacak objelerin bir sefer yaratılıp
* aynı objenin birden fazla yerde yeniden
* yaratılmadan kullanılmasını sağlar
* MultiThread Test Sınıfı
*
*@version 1.0 Release 1
*@author Burak ISIKLI
*@date June 18, 2009
*
**/

public class Test {
private static Singleton singletona, singletonb;
public static void main(String[] args) {
// getInstance() iki ayrı thread ile çağırılsın.
Thread threada = new Thread() {
@Override
public void run() {
singletona = Singleton.getInstance();
}
};
threada.start();

Thread threadb = new Thread() {
@Override
public void run() {
singletonb = Singleton.getInstance();
}
};
threadb.start();

// Her iki thread tamamlanana kadar beklensin
while (!(threada.getState() == Thread.State.TERMINATED && threadb
.getState() == Thread.State.TERMINATED))
;

System.out.println(singletona == singletonb);
}
}

Serialization(Serileştirme)

Posted in Java by Burak IŞIKLI on 17 Haziran 2009

Bir nesne herhangi stream’a (örneğin bir file’a ) yazılabilir ve bir stream’den okunabilir. Programın çalışması esnasında hafızada bulunan nesneler program bitince (kapatılınca) yok olur. Ancak serialization tekniğiyle bir nesne diske veya herhangi bir yere kaydedilebilir. Bir program, kapanmadan önce bir dosyayaya sakladığı bir nesneyi daha sonra tekrar çalıştırıldığında dosyadan okuyabilir. Hatta bir programın yazdığı nesneyi aynı dosyadan başka bir program da okuyabilir. Bu şekilde nesnelerin network’te bir yerden diğerine gönderilmesi, veritabanına normal bir veri gibi kaydedilebilmesi mümkün olabilmektedir.

Serializable

Bir class’ın serialization’a tabi tutulabilmesi için bazı koşulları sağlaması gerekir.

1. Class public olmalı.

2. Serializable’ interface’ini implement etmeli. Bu interface’de implement edilecek herhangi bir method yoktur. Sadece class’ın serialize edilebilemesine class yazarının izin verdiği anlamına gelir. Bazı classlar güvenlik v.s. nedenlerle buna izin vermek istemeyebilir. Nesnenin içerisindeki bütün veri serializable olmalıdır. Bir tane bile serializable olmayan nesne varsa işlem başarısız olur.

3. Default (parametresiz) bir constructor’ı olmalıdır. Hiç bir constructor yazılmaması durumunda da default contructor’un geçerli olduğu için yine sorun olmaz.

Öncelikle yaratacağımız objeyi  Serializable yapmalıyız. Bunun için  Serializable implement etmeliyiz.

PersistentTime.java


package edu.burakkk.sun;

import java.io.Serializable;
import java.util.Date;
import java.util.Calendar;

public class PersistentTime implements Serializable {
 static final long serialVersionUID = 10275539472837495L;
 private Date time;

 public PersistentTime() {
 time = Calendar.getInstance().getTime();
 }

 public Date getTime() {
 return time;
 }
}

FlattenTime.java


package edu.burakkk.sun;

import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FlattenTime {
public static void main(String[] args) {
String filename = "time.ser";
if (args.length > 0) {
filename = args[0];
}
PersistentTime time = new PersistentTime();
FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
fos = new FileOutputStream(filename);
out = new ObjectOutputStream(fos);
out.writeObject(time);
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

InflateTime.java


package edu.burakkk.sun;

import java.io.ObjectInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Calendar;

public class InflateTime {
public static void main(String[] args) {
String filename = "time.ser";
if (args.length > 0) {
filename = args[0];
}
PersistentTime time = null;
FileInputStream fis = null;
ObjectInputStream in = null;
try {
fis = new FileInputStream(filename);
in = new ObjectInputStream(fis);
time = (PersistentTime) in.readObject();
in.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
// print out restored time
System.out.println("Flattened time: " + time.getTime());
System.out.println();
// print out the current time
System.out.println("Current time: " + Calendar.getInstance().getTime());
}
}

Bu programda FlattenTime execute ettiğimizde o andaki saati objeye alarak time.ser adıyla kaydediyor. Daha sonra InflateTime sınıfıyla da bu kaydedilmiş objeyi okuyabiliriz. Aynı zamanda programı derlerken argüman olarak dosya adını verdiğimiz takdirde obje verdiğimizle adla kaydedilip okunacaktır. Dikkati çeken diğer bir konu static final long serialVersionUID = 10275539472837495L kod satırıdır. Aslında bu serilize ettiğimiz objeyi daha sonra tanımlada kullanabileceğimiz bir anahtar değerdir.  Fakat olması şart değildir. ObjectOutputStream veya ObjectInputStream ile obje dosyasını yazma ve okumayı sağlıyoruz. Serialization özellikle network(ağ) programlamada çok kullanılan bir özelliktir.