EJB belirtimine göre üç temel bileşen çeşidi bulunmaktadır. Bunlar:
1- Entity Bean
2- Session Bean
3- Message-Driven Bean
Yukarıdaki ilk iki bileşen ilk kez EJB1.0 ve EJB 1.1 belirtimlerinde tanımlanmıştır. Bu yazıda verilecek bilgiler EJB1.1 belirtiminde tanımlanmış özellikleri kapsamaktadır. Message-Driven Bean ise EJB 2.0 belirtimiyle birlikte ortaya çıkmıştır. Message-Driven Bean ve EJB 2.0 ile gelen özelliklerden sonraki yazılarda bahsedilecektir.
Burada tanımlanan bileşen çeşitlerini detaylandırmadan önce bileşenlerin genel olarak sahip oldukları özellikleri belirtmekte fayda vardır.
EJB’nin İskeleti
EJB’nin öncelikle bilinmesi gereken özelliği dağıtık nesne teknolojilerini kullanmasıdır ve şu anda J2EE platformunun standart olarak kullandığı dağıtık nesne protokolü IIOP’dur. Ancak herhangi bir J2EE platformu (uygulama sunucusu da denilebilir) satıcısı kendi tescilli protokolünü bunun yanında kullanabilir. Bilindiği gibi dağıtık nesneler istemci tarafındaki bir vekil (stub) vasıtasıyla sunucu tarafındaki bir nesneye ulaşır. Bu mekanizma ile alakalı ayrıntılı bilgiyi bir önceki yazıda (EJB Nedir? -2) bulabilirsiniz. Tipik bir EJB bileşeni en azından şu üç sınıfı içerir:
1- Home Interface
2- Remote Interface
3- Bean Class
1) Home Interface
Bu “interface” bir EJB’nin yaşamsal döngüsünü belirleyen bir arayüzdür. Burada iki çeşit metod tanımlanabilir:
-create (yaratma) metodları
-finder (arama) metodları
Şunu baştan söylemek gerekir ki bir istemci bir bean'e her zaman uzaktan (remote) erişir. Bu kritere dayanarak home interface'i en basit ifadeyle şöyle tanımlayabiliriz. Sunucu tarafında varolan bir bean sınıfına erişimi sağlayan remote interface'i yaratmaya ya da bulmaya yarar. Aslında karmaşık gibi görünen bu ifade home interface’in görevlerinin büyük bir bölümünü oluşturur. Bu metodların özellikleri bileşenden bileşene (entity, stateful session, stateless session) değişir. Örneğin finder metodlar session bean’lerde bulunmazlar fakat entity bean'lerde en az bir tane (findByPrimaryKey) bulunmak zorundadır.
2) Remote Interface
Bu arayüz bean sınıfında tanımlanan tüm iş mantığı metodlarının aynısını içinde barındırır. Bu sayede istemci bean sınıfına direk olarak ulaşmadan bu arayüz vasıtasıyla bean sınıfının metodlarını çağırabilir. Buradan da anlaşılabildiği gibi bu arayüz bir kontrol mekanizması (controller) sağlar. Böylece “container” tarafından oluşturulan bu arayüzün implementasyon sınıfında çeşitli servisler sağlanabilir. Bu servisler böylece bean geliştiriciden bağımsız olarak gerçekleştirilmiş olur.
3) Bean Class
İş mantığının asıl gömüldüğü sınıftır. Bu sınıf sunucu tarafında bulunur ve sadece remote interface aracılığıyla erişilebilir.
Yukarıda bir EJB bileşenini oluşturan en temel üç parçayı gösterdik. Bunun yanında sadece entity bean’lerde kullanılan primary key sınıfı bulunur. Şimdi EJB bileşen çeşitlerini incelemeye başlayalım.
Entity Bean
Entity Bean EJB 1.0 belirtiminde opsiyonel olarak tanıtılmıştır ancak verinin objeleştirilmesinde gösterdiği başarı sayesinde EJB dünyasında yaygın bir şekilde kullanılmaya başlanmıştır. Bu yüzden EJB 1.1’de EJB Container’ların bu bileşen çeşidini desteklemeleri zorunlu hale getirilmiştir.
Entity bean herhangi bir veri kaynağındaki veriyi temsil eder. Örneğin ilişkisel bir veritabanında bulunan bir tablonun bir satırı bir entity bean instance’ına denk gelir. Bu bize ne avantaj sağlar? Sağladığı en büyük avantaj verinin objeleştirilmesidir. Bu sayede gerçekleştireceğimiz uygulamalarda veri kaynağı yerine nesnelerle uğraşırız. Ayrıca yazdığımız uygulamalar veri kaynağından bağımsız olur. Çünkü verinin veri kaynağından alınma işlemi bean sınıfından bağımsızdır ve container tarafından gerçekleştirilir. Biz bean uygulama geliştiricisiolarak uygulamalarımızı veri kaynağıyla alakalı sorunlardan bağımsız bir şekilde gerçekleştiririz.
Tanımlanmış olan iki tip entity bean vardır: CMP (Container-Managed Persistence) Entity Bean ve BMP (Bean-Managed Persistence) Entity Bean.
CMP Entity Bean
Bu bileşen çeşidinde veri kaynağı ile senkronizasyon işlemi tamamen container’a bırakılmıştır. Yani siz entity bean’i yazarsınız. Fakat bu bean’in veri kaynağından veriyi alma ve veri kaynağına veriyi yazma işlemleri container tarafından gerçekleştirir. Tabii ki bu geliştirici için idealdir fakat container üreticisi çok gelişmiş bir mapping özelliğini gerçekleştirmek zorundadır. Burada container üreticilerinin arasındaki performans farkları ortaya çıkar. Aslında J2EE sertifikalı tüm uygulama sunucuları bu işlemi gerçekleştirir fakat performans farkı kimin bu işi daha iyi yaptığını belirler.
BMP Entity Bean
Buradaki mapping işlemi tamamen geliştirici üzerine yüklenmiştir. Bazı durumlarda uygulamanın performansının artması için bu kaçınılmazdır. Bazen container’ın başedemeyeceği kadar büyük mapping sorunları da çıkabilir. Ayrıca sizin etkileşimde bulunmak istediğiniz veri kaynağını container satıcısı desteklemeyebilir. Bu sorunlar karşısında geliştirici kılıcını kuşanır ve senkronizasyon işlemini üstlenir. BMP’nin dezavantajlarından biri ise bileşene veri senkronizasyon kodu gömüldüğünden veri kaynağına bağımlı hale gelmesidir. Fakat bu da değişik mekanizmalarla önlenebilir. Bunlardan biri DAO (Data Access Object) pattern kullanımıdır.
Session Bean
Uygulamadaki iş akışını kontrol eden bileşenlerdir. Entity bean’in veriyi objeleştirdiğini yukarıda belirtmiştik. İşte bir uygulamanın ortaya çıkması için bu verinin bir şekilde işlenmesi gerekir. Çünkü bir uygulamanın çalışması demek sistemde bulunan verilerin anlamlı şekilde değişmesi demektir. Bu görevi session bean gerçekleştirir. Session bean, entity bean’leri kullanarak ve işleyerek, örneğin, bir ticari işletmenin iş akış süreçlerini gerçekleştirebilir. Bir diğer değişle ünlü iş mantığı (business logic) çoğunlukla session bean’ler tarafından gerçekleştirilir. Session bean de kendi içinde iki parçaya ayrılır.
- Stateful Session Bean (SFSB)
- Stateless Session Bean (SLSB)
Stateful Session Bean
Bu session bean çeşidi sunucu tarafındaki bir bean’nin istemci tarafındaki uzantısı olarak düşünülebilir. Sadece bir istemcinin isteklerini gerçekleştirir. SFSB’nin özelliği bean instance'ın yaşam süresi boyunca bir durum bilgisi (state) tutmasıdır. Kısaca bean üzerinde çağrılan farklı metodlar birbirlerinden haberdar olabilirler. Bu state bean sınıfının değişkenlerinde tutulur. Bunu basit bir örnekle açıklayalım. Örneğin bir istemci bir e-ticaret sitesine girsin. Bu ziyaretçinin bu siteden istediği malları alış-veriş sepetine attığını düşünelim. Bu istemci siteden malları seçtikçe bu alışveriş sepeti dolmaya başlayacaktır. İşte bunun anlamı bu istemci için sunucuda tutulan bir SFSB’nin bu malları bellekte tutması demektir. Eğer istemci bu malları almaktan vazgeçerse ya da satın alma işlemini başlatmazsa bu alış-veriş sepetindeki mallar istemci sunucuyla ilişkiyi kestiğinde kaybolur. (Aslında çoğu e-ticaret sitesi bu malları bir veritabanına yazar ve aynı istemcinin bir sonraki ziyaretinde karşısına çıkartabilir. Fakat biz burada bunların kaydedilmediğini varsayıyoruz). Bunun anlamı sunucudaki SFSB’nin yok edilmesidir.
SFSB bir diğer ifadeyle iş akışlarındaki senaryoların gerçekleştirilmesi anlamına da gelir. Bu senaryoları yazılımcı SFSB olarak tasarlar ve entity bean’leri bu senaryolara göre işleyerek işletmenin ihtiyaçlarını karşılar.
Stateless Session Bean
Stateless session bean küçük iş parçacıklarıdır. SFSB’den farkı hiçbir istemciye bağımlı olmayışıdır. İstemcilerle alakalı bilgi tutmaz. Fonksiyonel dillerde kullanılan RPC (Remote Procedure Call) ile eşdeğerdedir. Çünkü istemci metod çağrımını yapar ve sonucunu alır. Sistemde bu işlemle alakalı hiçbir durum bilgisi tutulmaz.
Performans bakımından en verimli olan bean'dir. Tüm ihtiyaç duyduğu bilgiyi parametre olarak alır ya da bir veri kaynağından elde eder. SLSB’lere en güzel örneklerden biri onaylama işlemleridir. Mesela bir transaction içerisinde bir öğrencinin bir dersten yeterli notu alıp almadığını kontrol etmek istersek bunu bu tip işlerin toplandığı bir stateless session bean içerisindeki bir metod vasıtasıyla gerçekleştirebiliriz. Bu metod çağrımı sonucunda bize sadece doğru ya da yanlış diye bir yanıt döndürülür.
Şimdi burada önemli bir noktaya değinelim. Yukarıdaki örnekte neden entity bean kullanmadık? Aslında ilk bakışta entity bean kullanmak mantıklı gelebilir. Ancak performans açısından bakıldığında SLSB kullanımı ön plana çıkar. Çünkü entity bean'in yaratılması sisteme SLSB’nin yaratılmasından daha fazla yük getirir. İkincisi ise entity bean yaratılırken sadece gerekli olan değişkenin değil tüm değişkenlerin veritabanıyla senkronizasyonu sağlanması gerekir. Fakat SLSB kullanıldığında yapılan tek şey yaratılan stateless bean'e öğrencinin numarasının verilmesi ve bu numara kullanılarak veritabanından istenen bilginin elde edildikten sonra karşılaştırma işleminin sonucunun döndürülmesidir. Bu gibi performans arttırımı sağlayan yaklaşımlarda her zaman SLSB kullanılmalıdır.
Kaynak
http://www.teknoturk.org/docking/yazilar/tt000093-yazi.htm
Oracle Teknolojileri, Weblogic, SOA Suite, Java, Kurumsal Veri Sözlüğü, API Gateway, API Manager, Veri Sözlüğü, SOAGEN, Metanizer, Apinizer
29 Ocak 2009 Perşembe
26 Ocak 2009 Pazartesi
Trigger kullanimi
Trigger - her hangi bir DML ve ya DDL emrleri calistiqinda calisan program kodudur. Bunu asagidaki basit bir ornekle gosterebiliriz..
Mesela bir table-imiz var, o table-a insert, update, delete eden user-lerin istifadeci adlarini, host-unu ve bu emri icra etdiyi tarihi control edib diger bir "log" table-ina yazmamiz lazim.
Boyle bir orneye bakalim
CREATE TABLE tbl_trigger_test (ID NUMBER, adi VARCHAR2(20))
/
CREATE TABLE tbl_log_trigger_test (username VARCHAR2(20), tarih DATE, host VARCHAR2(20), emeliyyat VARCHAR2(20))
/
INSERT INTO tbl_trigger_test
VALUES (1, 'Ertugrul')
/
COMMIT
/
CREATE OR REPLACE TRIGGER trg_trigger_test
BEFORE INSERT OR UPDATE OR DELETE
ON tbl_trigger_test
DECLARE
v_islem VARCHAR2 (20);
BEGIN
IF INSERTING
THEN
v_islem := 'INSERT';
ELSIF UPDATING
THEN
v_islem := 'UPDATE';
ELSIF DELETING
THEN
v_islem := 'DELETE';
END IF;
INSERT INTO tbl_log_trigger_test
VALUES (USER, SYSDATE, SYS_CONTEXT ('USERENV', 'HOST),
v_islem);
END;
Simdi, her defa tbl_trigger_test tablomuza INSERT, UPDATE, DELETE emrlerini uyqulasak, o zaman tbl_log_trigger_test tablomuz bir row eklenecekdir
SQL>SELECT * FROM tbl_log_trigger_test;
no rows selected
Log tablosunun ici bos. Simdi esas tabloya bazi satirlar ilave edib silelim, bakalim log-a alinicakmi?
SQL> insert into tbl_trigger_test values(2,'Asalan');
1 row created.
SQL> update tbl_trigger_test set id=0 where id=1;
1 row updated.
SQL> delete from tbl_trigger_test where id=0;
1 row deleted.
SQL>select * from tbl_log_trigger_test;
Ertugrul 24-JAN-2009 15:13:09 localhost INSERT
Ertugrul 24-JAN-2009 15:13:25 localhost UPDATE
Ertugrul 24-JAN-2009 15:13:49 localhost DELETE
10 Aralık 2008 Çarşamba
Exception Handling (Hata Yakalama)
Her programlama dilinde oldugu gibi Oracle ‘ın prosedürel veritabanı programlama dili olan PL/SQL de de gerek derleme sırasında(compile time), gerekse programın çalışması esnasında(run time) hata durumu ortaya çıkabilir.Bu yazıda bunların tespit edip yakalama ve program akışını buna göre düzenlemeye yönelik kısa bilgiler bulacaksınız.
PL/SQL de işlemi gercekleştirecek kod parcacıkları fonksiyon, procedür ya da script seklinde bir kod blogu ile olabilir.Hepsinin ortak yanı :
declare
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
end;
şeklinde bir bloktan oluşmalarıdır.NOT : Fonksiyon ve prosedür için örnekler şu şeklide verilebilir :
Fonksiyon örneği :
function fonksiyonXXX(param1 varchar2,param2 number….) return aDataType is
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
return aDataType;
end fonksiyonXXX;
Procedür örneği :
procedure procedurXXX (param1 varchar2,param2 number….) is
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
end prosedurXXX;
Türü ne olursa olsun hata yönetimi yapmak, hatayı yakalamak için her begin-end; bloğu arasında bu blokta olusacak hata için “exception” anahtar kelimesi kullanılmalıdır.
declare
begin
….
…..
….
…
exception
………………
end;
“exception” kısmında “end;” sonuna kadar olan kısımda, alınan birden fazla hatayı yakalamak mümkün.Bunun için “when” anahtar kelimesini kullanılır.
begin
……..
……….
………
exception
when exception1 then
———gerekli kodlar
——————–
when exception2 then
———gerekli kodlar
————–
when others then
————
.
.
end;
“exception1, exception2, …exceptionN” önceden tanımlı bir hata olabileceği gibi ,tanımsız olan herhangibir hata ya da kullanıcının tanımladıgı bir hata da olabilir.Önceden tanımlı hatalara örnek olarak
no_data_found
to_many_rows
zero_divide
…..
verilebilir.Bazı önceden tanımlı hatalar ve kodları aşağıda verilmiştir.
Exception Oracle Error SQLCODE Value
ACCESS_INTO_NULL ORA-06530 -6530
CASE_NOT_FOUND ORA-06592 -6592
COLLECTION_IS_NULL ORA-06531 -6531
CURSOR_ALREADY_OPEN ORA-06511 -6511
DUP_VAL_ON_INDEX ORA-00001 -1
INVALID_CURSOR ORA-01001 -1001
INVALID_NUMBER ORA-01722 -1722
LOGIN_DENIED ORA-01017 -1017
NO_DATA_FOUND ORA-01403 +100
NOT_LOGGED_ON ORA-01012 -1012
PROGRAM_ERROR ORA-06501 -6501
ROWTYPE_MISMATCH …………………….. ORA-06504 ……………………. -6504 …………………
Önceden tanımlı hata kodları ile tanımı olmayan diger hatalarda muhakkak bir hata kodu(ORA-xyzwt) bulunmaktadır.Belirli bir hatayı değilde alınan herhangibir ya da belirtilmeyen başka hataları yakalamak için “when” den sonra “others” kullanılır.
NOT : Oracle , hata oluştugu anda bu hataya ait hata kodunu “sqlcode” değişkenine, hata acıklamasını da “sqlerrm” değişkenine otomatik olarak atar.Bunlar gerekirse okunarak kullanılabilir.Kullanıcı tanımlı hatalar için de öncelikte hata değişkeni tanımı yapılmalıdır.Bunun herhangibir veri tipi tanımlamadan farkı yoktur.
declare
something_wrong exception;
declare
if(…) then
raise someting_wrong;
…………….
………
exception
when something_wrong then
–gerekli işlemler…
when others then
–gerekli işlemler….
end;
“exception” bloğuna düşen hatada bir takım işlemler yapılabileceği gibi bu PL/SQL kodunu çağıran yere de bir hata fırlatmak isteyebiliriz.(throw exception).Bunun içinde “raise _applicaion_error(errorID, errorDesc)” kullanılır.“errorID” ve “errorDesc” alanlarını kullanıcı belirler.”errorID” [-20000,-20999] arasında bir değer olmalıdır.”errorDesc” alanıda en fazla 2000 karakterlik “varchar2” veri tipinde açıklama yazılabilir.
Örneğin bir prosedürümüz olsun ve bu prosedür basitçe gönderilen parametrenin 1000’den büyük olup olmadıgını kontrol etsin.Büyük ise yukarı hata versin.
procedure prc_checkValue(p_vlaue number) is
begin
if(p_value > 1000) then
raise_application_error(-20010,’Value is too large);
end;
Bunu yapmanın bir başka yoluda bir hata tanımlayıp bu hatayı “raise etmek :
procedure prc_checkValue(p_vlaue number) is
too_large exception;
begin
if(p_value > 1000) then
raise too_large;
exception
when too_large then
raise_application_error(-20010,’Value is too large);
end;
PL/SQL de işlemi gercekleştirecek kod parcacıkları fonksiyon, procedür ya da script seklinde bir kod blogu ile olabilir.Hepsinin ortak yanı :
declare
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
end;
şeklinde bir bloktan oluşmalarıdır.NOT : Fonksiyon ve prosedür için örnekler şu şeklide verilebilir :
Fonksiyon örneği :
function fonksiyonXXX(param1 varchar2,param2 number….) return aDataType is
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
return aDataType;
end fonksiyonXXX;
Procedür örneği :
procedure procedurXXX (param1 varchar2,param2 number….) is
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
end prosedurXXX;
Türü ne olursa olsun hata yönetimi yapmak, hatayı yakalamak için her begin-end; bloğu arasında bu blokta olusacak hata için “exception” anahtar kelimesi kullanılmalıdır.
declare
begin
….
…..
….
…
exception
………………
end;
“exception” kısmında “end;” sonuna kadar olan kısımda, alınan birden fazla hatayı yakalamak mümkün.Bunun için “when” anahtar kelimesini kullanılır.
begin
……..
……….
………
exception
when exception1 then
———gerekli kodlar
——————–
when exception2 then
———gerekli kodlar
————–
when others then
————
.
.
end;
“exception1, exception2, …exceptionN” önceden tanımlı bir hata olabileceği gibi ,tanımsız olan herhangibir hata ya da kullanıcının tanımladıgı bir hata da olabilir.Önceden tanımlı hatalara örnek olarak
no_data_found
to_many_rows
zero_divide
…..
verilebilir.Bazı önceden tanımlı hatalar ve kodları aşağıda verilmiştir.
Exception Oracle Error SQLCODE Value
ACCESS_INTO_NULL ORA-06530 -6530
CASE_NOT_FOUND ORA-06592 -6592
COLLECTION_IS_NULL ORA-06531 -6531
CURSOR_ALREADY_OPEN ORA-06511 -6511
DUP_VAL_ON_INDEX ORA-00001 -1
INVALID_CURSOR ORA-01001 -1001
INVALID_NUMBER ORA-01722 -1722
LOGIN_DENIED ORA-01017 -1017
NO_DATA_FOUND ORA-01403 +100
NOT_LOGGED_ON ORA-01012 -1012
PROGRAM_ERROR ORA-06501 -6501
ROWTYPE_MISMATCH …………………….. ORA-06504 ……………………. -6504 …………………
Önceden tanımlı hata kodları ile tanımı olmayan diger hatalarda muhakkak bir hata kodu(ORA-xyzwt) bulunmaktadır.Belirli bir hatayı değilde alınan herhangibir ya da belirtilmeyen başka hataları yakalamak için “when” den sonra “others” kullanılır.
NOT : Oracle , hata oluştugu anda bu hataya ait hata kodunu “sqlcode” değişkenine, hata acıklamasını da “sqlerrm” değişkenine otomatik olarak atar.Bunlar gerekirse okunarak kullanılabilir.Kullanıcı tanımlı hatalar için de öncelikte hata değişkeni tanımı yapılmalıdır.Bunun herhangibir veri tipi tanımlamadan farkı yoktur.
declare
something_wrong exception;
declare
if(…) then
raise someting_wrong;
…………….
………
exception
when something_wrong then
–gerekli işlemler…
when others then
–gerekli işlemler….
end;
“exception” bloğuna düşen hatada bir takım işlemler yapılabileceği gibi bu PL/SQL kodunu çağıran yere de bir hata fırlatmak isteyebiliriz.(throw exception).Bunun içinde “raise _applicaion_error(errorID, errorDesc)” kullanılır.“errorID” ve “errorDesc” alanlarını kullanıcı belirler.”errorID” [-20000,-20999] arasında bir değer olmalıdır.”errorDesc” alanıda en fazla 2000 karakterlik “varchar2” veri tipinde açıklama yazılabilir.
Örneğin bir prosedürümüz olsun ve bu prosedür basitçe gönderilen parametrenin 1000’den büyük olup olmadıgını kontrol etsin.Büyük ise yukarı hata versin.
procedure prc_checkValue(p_vlaue number) is
begin
if(p_value > 1000) then
raise_application_error(-20010,’Value is too large);
end;
Bunu yapmanın bir başka yoluda bir hata tanımlayıp bu hatayı “raise etmek :
procedure prc_checkValue(p_vlaue number) is
too_large exception;
begin
if(p_value > 1000) then
raise too_large;
exception
when too_large then
raise_application_error(-20010,’Value is too large);
end;
5 Aralık 2008 Cuma
Kalitim (Inheritance)
Kalıtım konusu nesneye yönelik programlamanın (object oriented programming) en önemli kavramlarından bir tanesidir. Kalıtım kavramı, kısaca bir sınıftan diğer bir sınıfın türemesidir. Yeni türeyen sınıf, türetilen sınıfın global alanlarına ve yordamlarına (statik veya değil) otomatik olarak sahip olur (private olanlar hariç). ()
Unutulmaması gereken unsur, yeni türeyen sınıf, türetilen sınıfın private global alanlarına ve yordamlarına (statik veya değil) otomatik olarak sahip olamaz. Ayrıca yeni türeyen sınıf eğer türetilen sınıf ile ayrı paketlerde ise yeni türeyen sınıf, türetilen sınıfın sadece public ve protected erişim belirleyicisine sahip olan global alanlarına (statik veya değil) ve yordamlarına (statik veya değil) otomatik olarak sahip olur. ()
class Kedi {
//..
}
class Kaplan extends Kedi {
//..
}
Kedi sınıfından türeyen Kaplan sınıfı… İki sınıf arasındaki ilişkiyi şöyle tarif edebiliriz, her Kaplan bir Kedi dir. Yani her kaplan kedisel özellikler taşıyacaktır ama bu özelliklerin üzerine kendisine bir şeyler eklemiştir. ()
Yazılış ifadesi olarak, türeyen sınıf isminin yanına extends ifadesini koyarak, hemen sonrasında kendisinden türetilme yapılan sınıfın kendisini yerleştiririz
Bu konuyu daha iyi bir sekilde pekistirmemiz icin hemen bi ornek yapalim mi :)...
public class Bicycle{
// Bu arada bi hatilatma daha bulunalim, class isimleri herzaman buyuk harfler baslar
public int cadence;
public int gear;
public int speed;
// calssimizi yapilandiralim
public Bicycle(int gear, int speed, int cadence){
this.gear = gear;
this.speed = speed;
this.cadence = cadence;
//this kullanimina baska bir makalede uzun bir yer ayiracaz :)
}
//clasimizin methodlari
public void setCadence(int newValue){
cadence = newValue;
}
public void setGear(int newValue){
gear = newValue;
}
public void speedUp(int increment){
speed +=increment;
}
}
// simdi bicycle clasimizi MountainBike ile extends edeilim
public class MountainBike extends Bicycle{
public int seatHeight;
public MountainBike(int Height, int cadence, int speed, int gear){
// super kullaniminada ayireten deyinecez
super(cadence, speed, gear);
seatHeight = Height;
public void setHeight(int newValue){
seatHeight = newValue;
}
}
Bu ornegimiz faydali olmustur umarum, ama kalitim konusu dedigimiz cok onemli bir konu oldugu icin biraz daha uzerininde durmamiz gerekiyor....
Gizli Kalıtım
Oluşturduğumuz her yeni sınıf otomatik ve gizli olarak Object sınıfından türer. Object sınıfı Java programlama dili içerisinde kullanılan tüm sınıfların tepesinde bulunur. ()
public class YeniBirSinif {
public static void main(String[] args) {
YeniBirSinif ybs1 = new YeniBirSinif();
YeniBirSinif ybs2 = new YeniBirSinif();
System.out.println("YeniBirSinif.toString()" + ybs1 );
System.out.println("YeniBirSinif.toString()" + ybs2 ) ;
System.out.println("ybs1.equals(ybs2)"+ybs1.equals(ybs2)) ;
// ....
}
}
Uygulamamızın çıktısı aşağıdaki gibi olur:
YeniBirSinif.toString() YeniBirSinif@82f0dbYeniBirSinif.toString() YeniBirSinif@92d342ybs1.equals(ybs2) falseYeniBirSinif sınıfımızda, toString()ve equals() yordamları tanımlanmamasına rağmen bu yordamları kullandık, ama nasıl ? Biz yeni bir sınıf tanımladığımızda, Java gizli ve otomatik olarak extends Object, ibaresini yerleştirir. ()
Buradan su anlasiliyorki demekki biz her yazdigimiz uygulamda kalitim kullaniyoruz ama fark etmiyoruz, ama artik biliyoruz gizli kalitimin nasil bisey oldugunu...:)
ornekte verecek olursak hem daha iyi kavrariz hemde kullanabildfigmiz yordamlari ogrenmis oluruz.
public class YeniBirSinif extends Object {
Bu sayede Object nesnesine ait erişebilir yordamları kullanabiliriz. Object nesnesine ait yordamlar aşağıdaki gibidir: ()
clone() :Bu nesnenin(this) aynisini klonlar ve yeni nesneyi dondurur.
equals(Objesc obj) :obj referansina bagli olan nesnenin, kendisine(this) esit olup olmadigini kontrolunu yapar.
finalize() :Cop toplaycisi tarafindan silinmeden once calistirlan son yordam(method).
getClass() :Bu nesnenin caisma anindaki sinizf bilgilerini Class nesnesi seklinde geri dondurur.
hashClass() :Bu nesnenin has kodunu geri doner;
notify(): Bu nesnenin (this), monitöründe olan tek bir iş parçacığını (thread) uyandırır. (ilerleyen bölümlerde inceleyeceğiz) ()
· notifyAll(): Bu nesnenin (this), monitöründe olan tüm iş parçacıklarını (thread) uyandırır. (ilerleyen bölümlerde incelenecektir) ()
· toString(): Bu nesnenin (this), String tipindeki ifadesini geri döner. ()
· wait(): O andaki iş parçacığının (thread) beklemesini sağlar; Bu bekleme notify() veya notifyAll() yordamları sayesinde sona erer. ()
· wait (long zamanAsimi):O andaki iş parçacığının (thread), belirtilen süre kadar beklemesini sağlar (zamanAsimi); bu bekleme notify() veya notifyAll() yordamları sayesinde de sona erdirilebilir. ()
· wait (long zamanAsimi, int nanos):O andaki iş parçacığının (thread), belirtilen gerçek süre kadar (zamanAsimi+ nanos) beklemesini sağlar; bu bekleme notify() veya notifyAll() yordamları sayesinde de sona erdirilebilir. nanos parametresi 0-999999 arasında olmalıdır. ()
Kısacası, oluşturulan her yeni sınıf, yukarıdaki, yordamlara otomatik olarak sahip olur. Bu yordamları yeni oluşan sınıfların içerisinde tekrardan istediğimiz gibi yazabiliriz (uygun olan yordamları iptal edebiliriz-override). Örneğin finalize() yordamı kendi sınıfımızın içerisinde farklı sorumluluklar verebiliriz (çizgi çizen bir nesnenin, bellekten silinirken çizdiği çizgileri temizlemesi gibi). Bu olaya, ana sınıfın yordamlarını iptal etmek (override) denir.
Kalıtım ve İlk Değer Alma SırasıTek bir sınıf içerisinde ilk değerlerin nasıl alındığı 3. bölümde incelenmişti İşin içerisine birde kalıtım kavramı girince olaylar biraz karışabilir. Kalıtım (inheritance) kavramı bir sınıftan, başka bir sınıf kopyalamak değildir. Kalıtım kavramı, türeyen bir sınıfın, türetildiği sınıfa ait erişilebilir olan özellikleri alması ve ayrıca kendisine ait özellikleri tanımlayabilmesi anlamına gelir. Bir sınıfa ait nesne oluşurken, ilk önce bu sınıfa ait yapılandırıcının (constructor) çağrıldığını önceki bölümlerimizden biliyoruz. ()
Verilen örnekte, UcanYarasa nesnesi oluşmadan evvel, UcanYarasa sınıfının ana sınıfı olan Yarasa nesnesi oluşturulmaya çalışılacaktır. Fakat Yarasa sınıfıda Hayvan sınıfından türetildiği için daha öncesinde Hayvan sınıfına ait olan yapılandırıcı çalıştırılacaktır. Bu zincirleme giden olayın en başında ise Object sınıfı vardır. ()
IlkDegerVermeSirasi.java ()
class Hayvan {
public Hayvan() {
System.out.println("Hayvan Yapilandiricisi");
}
}
class Yarasa extends Hayvan {
public Yarasa() {
System.out.println("Yarasa Yapilandiricisi");
}
}
class UcanYarasa extends Yarasa{ public UcanYarasa() {
System.out.println("UcanYarasa Yapilandiricisi");
}
public static void main(String args[]) {
UcanYarasa uy = new UcanYarasa();
}
}
Object sınıfını bir kenara koyarsak, ilk olarak Hayvan sınıfının yapılandırıcısı çalışacaktır, daha sonra Yarasa sınıfının yapılandırıcısı çalışacaktır ve en son olarak UcanYarasa sınıfının yapılandırıcısı çalışacaktır. Bu yapılandırıcıların hepsi, fark edildiği üzere varsayılan yapılandırıcıdır (default constructor). Uygulamanın çıktısı aşağıdaki gibi olacaktır; ()
Hayvan YapilandiricisiYarasa YapilandiricisiUcanYarasa Yapilandiricisi
Parametre Alan Yapilandiricilar ve Kalitim
Ana sinifina ait yapilandirici cagirma islemi, varsayilan yapilandiricilar icin otomatik olarak yurtulen, parametere alan yapilandiricilar icin olay biraz daha degisiiktir. Kisaca Ana sinfin parametre alan yapilandiricisini acik olarak supr anahtar kelimesi ile cagirmak gereklidir. Soyle ki;
// bu ornegi dikkatlice inceleyelim ve super() kullanimia dikkat edin
Class Insan {
public Insan(int par){
System.out.println("Insan yapilandiricisi "+ par);
}
}
class ZekiInsan extends Insan{
public ZekiInsan(int par){
super(par+1);//dikkat
System.out.println("ZekiInsan Yapilandiricisi "+par);
}
}
class Hacker extends ZekiInsan{
public Hacker(int par){
super (par+1);//dikkat
System.out.println("Hacker yapilandiricisi "+par);
}
public static void main(String args[]){
Hacker hck = new Hacker(5);
}
}
Yukarıdaki örneğimizde, her sınıf, yapılandırıcısına gelen değeri bir arttırıp ana sınıfının yapılandırıcısına göndermektedir. Fark edildiği üzere ana sınıfın parametre alan yapılandırıcısını çağırırken super anahtar kelimesini kullandık. Uygulamanın çıktısı aşağıdaki gibidir. ()
Insan Yapilandiricisi 7
ZekiInsan Yapilandiricisi 6
Hacker Yapilandiricisi 5
Bu arda Onemli bir not, super() anahtar kelimesi herzaman bulundugu yapilandiricinin ilk satirda olmak zorundadir.
Komposizyon mu? Kalıtım mı?
Yeni oluşturduğunuz sınıfın içerisinde, daha evvelden yazılmış sınıfların özelliklerinden faydalanmak istiyorsanız bunun iki yolu olduğunu belirtmiştik; Komposizyon ve kalıtım. Peki hangi yöntemi ne zaman tercih etmeliyiz? Komposizyon, daha evvelden yazılmış sınıfların özelliklerini kullanmak için temiz bir yöntemdir.
Peki, kalıtım kavramı ne zaman kullanılır? Daha evvelden yazılmış bir sınıfın, belli bir problem için yeni versiyonunu yazma işleminde, kalıtım kavramı kullanılabilir. Fakat kalıtım konusunda türetilen sınıf ile türeyen sınıf arasında bir ilişki olmalıdır. Bu ilişki "bir" ilişkisidir. Örneğin Kedi ve Kaplan sınıflarını göz önüne alırsak, şöyle bir söz yanlış olmaz sanırım, Kaplan bir Kedidir. Bu iki sınıf arasında "bir" (is -a) ilişkisi olduğundan, kalıtım kavramını bu sınıflar üzerinde rahatça kullanabiliriz. ()
Örnekleri çoğaltmak mümkündür; UçanYarasa, Yarasa ve Hayvan arasındaki ilişki açıklanısa, ()
· UçanYarasa bir Yarasadır;
· Yarasa bir Hayvandır;
· O zaman UçanYarasa'da bir Hayvandır.
· Hayvan'da bir Nesnedir.
Unutulmaması gereken unsur, yeni türeyen sınıf, türetilen sınıfın private global alanlarına ve yordamlarına (statik veya değil) otomatik olarak sahip olamaz. Ayrıca yeni türeyen sınıf eğer türetilen sınıf ile ayrı paketlerde ise yeni türeyen sınıf, türetilen sınıfın sadece public ve protected erişim belirleyicisine sahip olan global alanlarına (statik veya değil) ve yordamlarına (statik veya değil) otomatik olarak sahip olur. ()
class Kedi {
//..
}
class Kaplan extends Kedi {
//..
}
Kedi sınıfından türeyen Kaplan sınıfı… İki sınıf arasındaki ilişkiyi şöyle tarif edebiliriz, her Kaplan bir Kedi dir. Yani her kaplan kedisel özellikler taşıyacaktır ama bu özelliklerin üzerine kendisine bir şeyler eklemiştir. ()
Yazılış ifadesi olarak, türeyen sınıf isminin yanına extends ifadesini koyarak, hemen sonrasında kendisinden türetilme yapılan sınıfın kendisini yerleştiririz
Bu konuyu daha iyi bir sekilde pekistirmemiz icin hemen bi ornek yapalim mi :)...
public class Bicycle{
// Bu arada bi hatilatma daha bulunalim, class isimleri herzaman buyuk harfler baslar
public int cadence;
public int gear;
public int speed;
// calssimizi yapilandiralim
public Bicycle(int gear, int speed, int cadence){
this.gear = gear;
this.speed = speed;
this.cadence = cadence;
//this kullanimina baska bir makalede uzun bir yer ayiracaz :)
}
//clasimizin methodlari
public void setCadence(int newValue){
cadence = newValue;
}
public void setGear(int newValue){
gear = newValue;
}
public void speedUp(int increment){
speed +=increment;
}
}
// simdi bicycle clasimizi MountainBike ile extends edeilim
public class MountainBike extends Bicycle{
public int seatHeight;
public MountainBike(int Height, int cadence, int speed, int gear){
// super kullaniminada ayireten deyinecez
super(cadence, speed, gear);
seatHeight = Height;
public void setHeight(int newValue){
seatHeight = newValue;
}
}
Bu ornegimiz faydali olmustur umarum, ama kalitim konusu dedigimiz cok onemli bir konu oldugu icin biraz daha uzerininde durmamiz gerekiyor....
Gizli Kalıtım
Oluşturduğumuz her yeni sınıf otomatik ve gizli olarak Object sınıfından türer. Object sınıfı Java programlama dili içerisinde kullanılan tüm sınıfların tepesinde bulunur. ()
public class YeniBirSinif {
public static void main(String[] args) {
YeniBirSinif ybs1 = new YeniBirSinif();
YeniBirSinif ybs2 = new YeniBirSinif();
System.out.println("YeniBirSinif.toString()" + ybs1 );
System.out.println("YeniBirSinif.toString()" + ybs2 ) ;
System.out.println("ybs1.equals(ybs2)"+ybs1.equals(ybs2)) ;
// ....
}
}
Uygulamamızın çıktısı aşağıdaki gibi olur:
YeniBirSinif.toString() YeniBirSinif@82f0dbYeniBirSinif.toString() YeniBirSinif@92d342ybs1.equals(ybs2) falseYeniBirSinif sınıfımızda, toString()ve equals() yordamları tanımlanmamasına rağmen bu yordamları kullandık, ama nasıl ? Biz yeni bir sınıf tanımladığımızda, Java gizli ve otomatik olarak extends Object, ibaresini yerleştirir. ()
Buradan su anlasiliyorki demekki biz her yazdigimiz uygulamda kalitim kullaniyoruz ama fark etmiyoruz, ama artik biliyoruz gizli kalitimin nasil bisey oldugunu...:)
ornekte verecek olursak hem daha iyi kavrariz hemde kullanabildfigmiz yordamlari ogrenmis oluruz.
public class YeniBirSinif extends Object {
Bu sayede Object nesnesine ait erişebilir yordamları kullanabiliriz. Object nesnesine ait yordamlar aşağıdaki gibidir: ()
clone() :Bu nesnenin(this) aynisini klonlar ve yeni nesneyi dondurur.
equals(Objesc obj) :obj referansina bagli olan nesnenin, kendisine(this) esit olup olmadigini kontrolunu yapar.
finalize() :Cop toplaycisi tarafindan silinmeden once calistirlan son yordam(method).
getClass() :Bu nesnenin caisma anindaki sinizf bilgilerini Class nesnesi seklinde geri dondurur.
hashClass() :Bu nesnenin has kodunu geri doner;
notify(): Bu nesnenin (this), monitöründe olan tek bir iş parçacığını (thread) uyandırır. (ilerleyen bölümlerde inceleyeceğiz) ()
· notifyAll(): Bu nesnenin (this), monitöründe olan tüm iş parçacıklarını (thread) uyandırır. (ilerleyen bölümlerde incelenecektir) ()
· toString(): Bu nesnenin (this), String tipindeki ifadesini geri döner. ()
· wait(): O andaki iş parçacığının (thread) beklemesini sağlar; Bu bekleme notify() veya notifyAll() yordamları sayesinde sona erer. ()
· wait (long zamanAsimi):O andaki iş parçacığının (thread), belirtilen süre kadar beklemesini sağlar (zamanAsimi); bu bekleme notify() veya notifyAll() yordamları sayesinde de sona erdirilebilir. ()
· wait (long zamanAsimi, int nanos):O andaki iş parçacığının (thread), belirtilen gerçek süre kadar (zamanAsimi+ nanos) beklemesini sağlar; bu bekleme notify() veya notifyAll() yordamları sayesinde de sona erdirilebilir. nanos parametresi 0-999999 arasında olmalıdır. ()
Kısacası, oluşturulan her yeni sınıf, yukarıdaki, yordamlara otomatik olarak sahip olur. Bu yordamları yeni oluşan sınıfların içerisinde tekrardan istediğimiz gibi yazabiliriz (uygun olan yordamları iptal edebiliriz-override). Örneğin finalize() yordamı kendi sınıfımızın içerisinde farklı sorumluluklar verebiliriz (çizgi çizen bir nesnenin, bellekten silinirken çizdiği çizgileri temizlemesi gibi). Bu olaya, ana sınıfın yordamlarını iptal etmek (override) denir.
Kalıtım ve İlk Değer Alma SırasıTek bir sınıf içerisinde ilk değerlerin nasıl alındığı 3. bölümde incelenmişti İşin içerisine birde kalıtım kavramı girince olaylar biraz karışabilir. Kalıtım (inheritance) kavramı bir sınıftan, başka bir sınıf kopyalamak değildir. Kalıtım kavramı, türeyen bir sınıfın, türetildiği sınıfa ait erişilebilir olan özellikleri alması ve ayrıca kendisine ait özellikleri tanımlayabilmesi anlamına gelir. Bir sınıfa ait nesne oluşurken, ilk önce bu sınıfa ait yapılandırıcının (constructor) çağrıldığını önceki bölümlerimizden biliyoruz. ()
Verilen örnekte, UcanYarasa nesnesi oluşmadan evvel, UcanYarasa sınıfının ana sınıfı olan Yarasa nesnesi oluşturulmaya çalışılacaktır. Fakat Yarasa sınıfıda Hayvan sınıfından türetildiği için daha öncesinde Hayvan sınıfına ait olan yapılandırıcı çalıştırılacaktır. Bu zincirleme giden olayın en başında ise Object sınıfı vardır. ()
IlkDegerVermeSirasi.java ()
class Hayvan {
public Hayvan() {
System.out.println("Hayvan Yapilandiricisi");
}
}
class Yarasa extends Hayvan {
public Yarasa() {
System.out.println("Yarasa Yapilandiricisi");
}
}
class UcanYarasa extends Yarasa{ public UcanYarasa() {
System.out.println("UcanYarasa Yapilandiricisi");
}
public static void main(String args[]) {
UcanYarasa uy = new UcanYarasa();
}
}
Object sınıfını bir kenara koyarsak, ilk olarak Hayvan sınıfının yapılandırıcısı çalışacaktır, daha sonra Yarasa sınıfının yapılandırıcısı çalışacaktır ve en son olarak UcanYarasa sınıfının yapılandırıcısı çalışacaktır. Bu yapılandırıcıların hepsi, fark edildiği üzere varsayılan yapılandırıcıdır (default constructor). Uygulamanın çıktısı aşağıdaki gibi olacaktır; ()
Hayvan YapilandiricisiYarasa YapilandiricisiUcanYarasa Yapilandiricisi
Parametre Alan Yapilandiricilar ve Kalitim
Ana sinifina ait yapilandirici cagirma islemi, varsayilan yapilandiricilar icin otomatik olarak yurtulen, parametere alan yapilandiricilar icin olay biraz daha degisiiktir. Kisaca Ana sinfin parametre alan yapilandiricisini acik olarak supr anahtar kelimesi ile cagirmak gereklidir. Soyle ki;
// bu ornegi dikkatlice inceleyelim ve super() kullanimia dikkat edin
Class Insan {
public Insan(int par){
System.out.println("Insan yapilandiricisi "+ par);
}
}
class ZekiInsan extends Insan{
public ZekiInsan(int par){
super(par+1);//dikkat
System.out.println("ZekiInsan Yapilandiricisi "+par);
}
}
class Hacker extends ZekiInsan{
public Hacker(int par){
super (par+1);//dikkat
System.out.println("Hacker yapilandiricisi "+par);
}
public static void main(String args[]){
Hacker hck = new Hacker(5);
}
}
Yukarıdaki örneğimizde, her sınıf, yapılandırıcısına gelen değeri bir arttırıp ana sınıfının yapılandırıcısına göndermektedir. Fark edildiği üzere ana sınıfın parametre alan yapılandırıcısını çağırırken super anahtar kelimesini kullandık. Uygulamanın çıktısı aşağıdaki gibidir. ()
Insan Yapilandiricisi 7
ZekiInsan Yapilandiricisi 6
Hacker Yapilandiricisi 5
Bu arda Onemli bir not, super() anahtar kelimesi herzaman bulundugu yapilandiricinin ilk satirda olmak zorundadir.
Komposizyon mu? Kalıtım mı?
Yeni oluşturduğunuz sınıfın içerisinde, daha evvelden yazılmış sınıfların özelliklerinden faydalanmak istiyorsanız bunun iki yolu olduğunu belirtmiştik; Komposizyon ve kalıtım. Peki hangi yöntemi ne zaman tercih etmeliyiz? Komposizyon, daha evvelden yazılmış sınıfların özelliklerini kullanmak için temiz bir yöntemdir.
Peki, kalıtım kavramı ne zaman kullanılır? Daha evvelden yazılmış bir sınıfın, belli bir problem için yeni versiyonunu yazma işleminde, kalıtım kavramı kullanılabilir. Fakat kalıtım konusunda türetilen sınıf ile türeyen sınıf arasında bir ilişki olmalıdır. Bu ilişki "bir" ilişkisidir. Örneğin Kedi ve Kaplan sınıflarını göz önüne alırsak, şöyle bir söz yanlış olmaz sanırım, Kaplan bir Kedidir. Bu iki sınıf arasında "bir" (is -a) ilişkisi olduğundan, kalıtım kavramını bu sınıflar üzerinde rahatça kullanabiliriz. ()
Örnekleri çoğaltmak mümkündür; UçanYarasa, Yarasa ve Hayvan arasındaki ilişki açıklanısa, ()
· UçanYarasa bir Yarasadır;
· Yarasa bir Hayvandır;
· O zaman UçanYarasa'da bir Hayvandır.
· Hayvan'da bir Nesnedir.
4 Aralık 2008 Perşembe
Java Interface
Interface Kavram?
Yaz?lan programramlarda Interface'lerin kullan?lmas?, dahas? OOP(Object Oriented Programming) kurallar?na uygun olarak kod yaz?lmas?, ilk olarak kod miktar? buyudukce yaz?lan class'lar?n hangi islevleri yerine getirdiginin bilinmek istenmesi sorununa futi kardesimin de dedigi gibi bir cevap olabilir.
Kodunuzda interface kullan?m?na giderseniz, size en buyuk yararlar?ndan biri, kabaca class'lar?n ne ise yarad?g?n?n kolayca ogrenilebilmesi de diyebilecegimiz, koda butun parcalar halinde bakabilmektir.Burdan kast etmek istedigim sey su; yazd?g?n?z program? tek bas?n?za gelistiriyorsan?z ve kod karmasas? da dusukse belki direkt faydas?n? goremeyebilirsiniz ancak bir tak?m halinde kod gelistiriyorsan?z buyuk bir class'?n tek bak?sta hangi islevleri yerine getirebildigini sizden baska birilerinin hemen kavrayabilmesi zor olabilir
Simdi ogulun babadan aldigi genlerin ilk etapla implementle ili$kisi yok. Oraya gelecegiz. Cünkü implement büyükbabayla baba arasinda.
Interface, icinde metod isimleri bulunan bir zorunluluk listesi gibidir. O interface'i implement eden sinif interface'in icinde adi gecen metodlarin hepsini gercellemek (to implement) zorundadir.
Yani Interface gen kalitimindan öte bir vasiyet gibidir. Büyük baba babaya eger benim oglum olmayi kabul ediyorsan bu $artlari (interface'deki metodlari) gercekle$tirmek zorundasin der. Baba Implements sözcügü ile bu vasiyeti kabul etmi$ olur ve $artlari (yani interface metodlarini) gercekle$tirir.
Extends ise cocugun babasindan dolayi sahip oldugu $eylerdir. Mesela cocugun kendine ait evi olmasi gerekmez. Cünkü babasinin evi vardir ve orada uyur. Babasinin evini, limuzinini, bankadaki parasini kullanir. Bunlar kendisine ait degildir ama babasin oldugu icin kullanma hakkina sahiptir. Bunlar tamamen babanin kendi kazanip edindigi mallar da olabilir, implements yoluyla büyükbabadan miras kalmi$ da olabilir. Cocuk icin hepsi aynidir. Sonucta nereden gelmi$ olursa olsun bu mallar babasinindir ve hepsinde kendisi de kullanim hakkina sahiptir.
Java'da interface, bir class'ta olmas? gereken method ve property'leri tan?mlayan yap?d?r. Kendisi normal bir class degildir, sadece neyin yap?lacag?n? gostermekte, ancak nas?l yap?lacag?n? gostermemektedir. Ornek olarak, bir madde'de ne gibi islevler ve ozellikler olmas? gerektigini belirten bir interface yazal?m.
Matter.javaIndir Goster Gizle Kopar Sat?r Gizle Sat?r Goster
public interface Matter{
public double getVolume();
public double getMass();
}
Bu ifade, 'bir maddenin yogunlugu, hacmi ve kutlesi olur' demenin Java'daki yoludur. Ancak goruldugu gibi maddenin yogunlugu nas?l hesaplan?r, kutlesi nas?l verilir, hic bir sekilde belirtmemektedir. Sadece ne olmas? gerktigini soylemektedir.
Interface'in Implementation'u
Bir class'?n interface'deki butun method'lar? icerdigini, gerceklestirdigini belirtmesine implementation denir ve 'implements' keyword'uyle kullan?l?r.
CubeMatter.javaIndir Goster Gizle Kopar Sat?r Gizle Sat?r Goster
public class CubeMatter implements Matter{
public double density=1.0;
public double edge=1.0;
public double getDensity(){
return density;
}
public double getVolume(){
return edge*edge*edge;
}
public double getMass(){
return density*edge*edge*edge;
}
}
Burada "Kup diye bir nesnemiz var ve o bir maddedir, yani bir maddede olabilecek butun nitelikler onda da bulunur." demis olduk ve bunlar?n nas?l hesapland?g?n? gosterdik. Ayn? interface'i implement eden baska bir class'da yap?labilir.
SphereMatter.javaIndir Goster Gizle Kopar Sat?r Gizle Sat?r Goster
public class SphereMatter implements Matter{
public double density=1.0;
public double radius=1.0;
public double getDensity(){
return density;
}
public double getVolume(){
return (3.14 * radius * radius * radius )/3;
}
public double getMass(){
return density*(3.14 * radius * radius * radius )/3;
}
}
Goruldugu gib bu class'da ayn? interface implement ediyor. Ancak hacim ve kutle hesaplamas? cok degisik
interfacle`rin nasil bi kolaylik sagladigini asagidaki adreste cok guzel anlatilmis
http://jtpd.org/docs/strategy_design_pattern.pdf
----
Interfaceeri kullanmak icin icin bi kac ornek yazalim
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
}
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
boolean didItWork(int i, double x, String s);
}
public interface DoItPlus extends DoIt {
boolean didItWork(int i, double x, String s);
}
Bunlarda interfaceleri tekrar nasil kullanabiliriz onlar hakkinda bi kac ornekdi :), Ama sunu soylemek istiyorum ki java ogrenebicegimiz en iyi yer Sun`nin itesidir.
Interfacelerin anlatildigi bolumun linki asagisdadir,
http://java.sun.com/docs/books/tutorial/java/IandI/interfaceAsType.html
Yaz?lan programramlarda Interface'lerin kullan?lmas?, dahas? OOP(Object Oriented Programming) kurallar?na uygun olarak kod yaz?lmas?, ilk olarak kod miktar? buyudukce yaz?lan class'lar?n hangi islevleri yerine getirdiginin bilinmek istenmesi sorununa futi kardesimin de dedigi gibi bir cevap olabilir.
Kodunuzda interface kullan?m?na giderseniz, size en buyuk yararlar?ndan biri, kabaca class'lar?n ne ise yarad?g?n?n kolayca ogrenilebilmesi de diyebilecegimiz, koda butun parcalar halinde bakabilmektir.Burdan kast etmek istedigim sey su; yazd?g?n?z program? tek bas?n?za gelistiriyorsan?z ve kod karmasas? da dusukse belki direkt faydas?n? goremeyebilirsiniz ancak bir tak?m halinde kod gelistiriyorsan?z buyuk bir class'?n tek bak?sta hangi islevleri yerine getirebildigini sizden baska birilerinin hemen kavrayabilmesi zor olabilir
Simdi ogulun babadan aldigi genlerin ilk etapla implementle ili$kisi yok. Oraya gelecegiz. Cünkü implement büyükbabayla baba arasinda.
Interface, icinde metod isimleri bulunan bir zorunluluk listesi gibidir. O interface'i implement eden sinif interface'in icinde adi gecen metodlarin hepsini gercellemek (to implement) zorundadir.
Yani Interface gen kalitimindan öte bir vasiyet gibidir. Büyük baba babaya eger benim oglum olmayi kabul ediyorsan bu $artlari (interface'deki metodlari) gercekle$tirmek zorundasin der. Baba Implements sözcügü ile bu vasiyeti kabul etmi$ olur ve $artlari (yani interface metodlarini) gercekle$tirir.
Extends ise cocugun babasindan dolayi sahip oldugu $eylerdir. Mesela cocugun kendine ait evi olmasi gerekmez. Cünkü babasinin evi vardir ve orada uyur. Babasinin evini, limuzinini, bankadaki parasini kullanir. Bunlar kendisine ait degildir ama babasin oldugu icin kullanma hakkina sahiptir. Bunlar tamamen babanin kendi kazanip edindigi mallar da olabilir, implements yoluyla büyükbabadan miras kalmi$ da olabilir. Cocuk icin hepsi aynidir. Sonucta nereden gelmi$ olursa olsun bu mallar babasinindir ve hepsinde kendisi de kullanim hakkina sahiptir.
Java'da interface, bir class'ta olmas? gereken method ve property'leri tan?mlayan yap?d?r. Kendisi normal bir class degildir, sadece neyin yap?lacag?n? gostermekte, ancak nas?l yap?lacag?n? gostermemektedir. Ornek olarak, bir madde'de ne gibi islevler ve ozellikler olmas? gerektigini belirten bir interface yazal?m.
Matter.javaIndir Goster Gizle Kopar Sat?r Gizle Sat?r Goster
public interface Matter{
public double getVolume();
public double getMass();
}
Bu ifade, 'bir maddenin yogunlugu, hacmi ve kutlesi olur' demenin Java'daki yoludur. Ancak goruldugu gibi maddenin yogunlugu nas?l hesaplan?r, kutlesi nas?l verilir, hic bir sekilde belirtmemektedir. Sadece ne olmas? gerktigini soylemektedir.
Interface'in Implementation'u
Bir class'?n interface'deki butun method'lar? icerdigini, gerceklestirdigini belirtmesine implementation denir ve 'implements' keyword'uyle kullan?l?r.
CubeMatter.javaIndir Goster Gizle Kopar Sat?r Gizle Sat?r Goster
public class CubeMatter implements Matter{
public double density=1.0;
public double edge=1.0;
public double getDensity(){
return density;
}
public double getVolume(){
return edge*edge*edge;
}
public double getMass(){
return density*edge*edge*edge;
}
}
Burada "Kup diye bir nesnemiz var ve o bir maddedir, yani bir maddede olabilecek butun nitelikler onda da bulunur." demis olduk ve bunlar?n nas?l hesapland?g?n? gosterdik. Ayn? interface'i implement eden baska bir class'da yap?labilir.
SphereMatter.javaIndir Goster Gizle Kopar Sat?r Gizle Sat?r Goster
public class SphereMatter implements Matter{
public double density=1.0;
public double radius=1.0;
public double getDensity(){
return density;
}
public double getVolume(){
return (3.14 * radius * radius * radius )/3;
}
public double getMass(){
return density*(3.14 * radius * radius * radius )/3;
}
}
Goruldugu gib bu class'da ayn? interface implement ediyor. Ancak hacim ve kutle hesaplamas? cok degisik
interfacle`rin nasil bi kolaylik sagladigini asagidaki adreste cok guzel anlatilmis
http://jtpd.org/docs/strategy_design_pattern.pdf
----
Interfaceeri kullanmak icin icin bi kac ornek yazalim
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
}
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
boolean didItWork(int i, double x, String s);
}
public interface DoItPlus extends DoIt {
boolean didItWork(int i, double x, String s);
}
Bunlarda interfaceleri tekrar nasil kullanabiliriz onlar hakkinda bi kac ornekdi :), Ama sunu soylemek istiyorum ki java ogrenebicegimiz en iyi yer Sun`nin itesidir.
Interfacelerin anlatildigi bolumun linki asagisdadir,
http://java.sun.com/docs/books/tutorial/java/IandI/interfaceAsType.html
28 Kasım 2008 Cuma
Pl/Sql
Dynamic SQL, runtime'de oluşturulan bir SQL'in çalıştırılmasıdır. Normalde programlarda veya PL/SQL bloklarında sorgu yazarken hard code olarak yazıp çalıştırılan SQL'ler static SQL'dir. Örneğin SQL*Plus üzerine yazdığımız bütün SQL'leri dynamic SQL ile çalıştırır. Dynamic SQL kavramı kullanım örneklerinden sonra daha anlaşılır olacaktır. • Dynamic SQL esnektir, kullanımı büyük esneklik sağlar, Ama Static SQL kullanmak çoğu zaman daha performanslı olacağı için static SQL ile yapılabilecek şeyleri static SQL ile yapmalı, dynamic SQL'i mecbur olduğunda kullanmalıdır. • Dynamic SQL'i ne zaman kullanırız? Run-time'da sorgularımızın inputlara gre veya başka şartlarda değişebileceği durumlarda veya DDL çalıştırmak için kullanırız. (Normalde PL/SQL bloğu içinde DDL çalıştırılamıyor) • Dynamic SQL, PL/SQL içinde iki şekilde kullanılabilir: Birincisi EXECUTE IMMEDIATE komutu ile, ikincisi ise DBMS_SQL paketi ile. Execute Immediate ile DML'leri, DDL'leri, PL/SQL bloklarını, Transaction Control komutlarını ve Session Control komutlarını kolaylıkla çalıştırabilirsiniz. Bu komut, sorgunun dinamik olarak runtime'da parse edilip çalıştırılmasını sağlar. DBMS_SQL paketi ise, biraz daha gelişmiş özellikleri barındırır. Daha çok özel amaçlarla kullanılır. Örneğin, sorgudan dönen kolon isimleri veya kolon sayısı gibi bir bilgi lazım olunca DBMS_SQL paketi kullanılabilir. Fakat daha fazla özellik barındırmayısla birlikte, kullanımı biraz daha zordur ve biraz daha yavaş çalışır. DBMS_SQL paketinin kullanımı ile ilgili ayrıntılı bilgiyi referanslarda da bulabilirsiniz. Her iki kullanım örneklerini de sunumda bulabilirsiniz. • Native Dynamic SQL(EXEC. IMMED.)'in avantajları: 1- Kullanımı kolaydır.2- Daha hızlı çalışır.3- Kullanıcı tanımlı tipleri destekler.4- Dönen kayıtları RECORD'lar içine atabilir. • DBMS_SQL paketinin avantajları: 1- Input ve output sayısı bilinmediğinde de kullanılabilir.2- Select'ten dönecek kolon sayısı veya isimleri belli olmadığında da çalıştırılabilir.3- 32KB'dan daha uzun sorguları da çalıştırabilir.4- Tekrar kullanılabilirliği sağlar. • Amacımız genellikle performans ve kolaylık avantajını yaklamak olduğu için, yapabildiğimiz herşeyi EXEC. IMMED. ile yapmamız daa mantıklı. Ama DBMS_SQL paketine gerçekten ihtiyacımız olan durumlr da oluyor, bu yüzden bu paketi ve yetkinliklerini bilmemiz de önemli.
Kaydol:
Kayıtlar (Atom)