Previous
Next

JAVA - Access specifiers(Erişim belirleyicileri) nedir?

by Cem Kefeli 20. Mayıs 2010 07:16

JavaÇoğu zaman, hayatın her alanında bazı kısıtlamalar ile karşılaşıyoruz. Eğer bir şeylere sahiplik varsa onun saklanması, korunması da çok doğal bir istektir. Herkes, her zaman herşeyini birileri ile paylaşmak istemeyebilir. Daha da ötesi paylaşmasının çok da uygun olmayabileceğini düşünebilir. İzinsiz kullanımın, yetkisiz kullanımın önüne geçilmesi için de böyle bir yapı şarttır aslında. Programlama dillerindeki access specifiers(erişim belirleyicileri) kavramı da tamamen bu doğal dürtünün sonucunda ortaya çıkmıştır. Ben bir sınıf yazıp bunu bir pakatin içerisinde başkaları ile paylaşabilirim. Başkalarının da yazdığım kod parçacıklarından faydalanamasını sağlayabilirim. Fakat sınıf içerisinde yer alan bazı değişkenlerin kimse tarafından değiştirilememesini, bazı yordamların override edilememesini isteyebilirim. Kodun sahibi olarak bunları isteyebilmek benim en doğal hakkımdır aslında. Şöyle toparlayabiliriz bu kısmı; erişim belirleyicileri, programcı tarafından oluşturulan her bir yazılım öğesinin paylaşım sınırlarını belirlemek için kullanılmaktadır. Şimdi bu konuyu biraz daha açmanın zamanı geldi...

Java Access Specifiers - Erişim Belirleyicileri Öncelikle şunu söyleyeyim, yandaki şekil gözünüzü korkutmasın. İş hiç de şekilde görüldüğü gibi karışık ve öğrenilmesi güç bir sey değil. Aslında bu şekli gördükten sonra üzerinde konuşmaya da çok fazla gerek yok. Çünkü bu şekil ne var ne yok gayet güzel bir şekilde açıklıyor olayı. Yine arada ekleyeceğimiz kısa notlar olacaktır. Bizim bu belirteçlerden özellikle üzerinde duracağımız public, friendly, private, protected erişim belirleyicileridir.

İlk önce friendly erişim belirleyicisi ile başlamak istiyorum. Friendly erişim belirleyicisi java dili için standart erişim belirleyicisidir. Yani eğer herhangi bir erişim belirteci yoksa friendly olarak kabul edilir. Bu erişim belirleyicisi metodlara, sınıflara ve alanlara uygulanabilmektedir. Özelliği ise aynı paket içerisindeki tüm sınıflardan bu üyelere erişilebilirken, paket dışı üyelerden bu üyelere erişilememektedir. Burada enteresan olan ise bu erişim belirleyicisinin kullanılmasının istenmemesidir. Yani bir metodun, sınıfın ya da alanın başına friendly anahtar sözcüğünün yazılması istenmemektedir. Yazarsanız hata ile karşılaşabilirsiniz. Eğer bir üyeyi friendly olarak tanımalamak isterseniz yapmanız gereken o alanı boş bırakmaktır.

Public erişim belirleyicsi tüm üyeler tarafından herhangi bir sınırlama olmadan erişilebilmektedir. Hem sınıflara, hem metodlara, hem de alanlara uygulanabilmektedir bu erişim belirleyicisi. Public erişim belirleyicisine sahip bir üyeye hem paket içinden hem paket dışından, hem tanımlandığı sınıftan hem tanımlandığı sınıf dışından, kullanıldığı sınıftan türetilen tüm sınıflardan erişilebilmektedir.Fazlası...

JAVA - Interfaces(Arayüzler)

by Cem Kefeli 18. Ekim 2009 10:52

JavaJava'da kalıtımın nasıl gerçekleştirildiğini "Inheritance(Kalıtım) nedir?" başlıklı yazım içerisinde görmüştük. Kalıtım, OOP(Object Oriented Programming) bir dilde olmazsa olmazlardandır ki, uygulama geliştiricilere çok büyük güzellikler sunar. Tüm canlılarda olduğu bigi nesneler arasında da kalıtım ilişkisi kurulur ve yeni yeni türler tanımlanmasını mümkün kılar. Bir nesne tanımlarsınız, sonra bu nesneden başka bir nesne daha türetebilirsiniz. Fakat ya iki ya da daha çok nesnenin bir araya gelip bir nesne oluşturmasını isterseniz ne olacaktır? İşte burada durum karışıktır! Çünkü java çoklu kalıtmı desteklemez. Bir nesneyi yalnızca bir tane nesneden türetebilirsiniz. Bu aşamada imdadımıza Interfaces(Arayüzler) yetişir ve her ne kadar tam anlamıyla çoklu kalıtım olmasa da buna benzer bir davranışı bizlere sunar.

  • Arayüzler içerisinde yalnızca Abstract(Soyut) metodlar ve sabitler(constants) bulundurabilirler, gövdeli metodlar barındıramazlar. Soyut metodları ve sınıfları incelerken de soyut sınıfların bir birleştirici rol oynadıklarını, soyut sınıflardan türeyen sınıflara adete bir kılavuz gibi yol gösterdiğinden bahsetmiştik. Fakat soyut sınıflar gövdeli metodlar yani iş yapabilen metodlar da barındırabiliyorlardı.
  • Ayrıca bir sınıfın birden fazla soyut sınıftan türemesi de söz konusu değildi.
  • Hem soyut sınıflarda hem de arayüzlerde ortak olan bir nokta ise, soyut sınıflarda abstract olarak tanımlanan ve arayüzlerde tanımlanan her metodun bu soyut sınıf ve arayüzlerden türeyen tüm sınıflarca override edilmesi gerekliliğidir. Bu arada şunu söylemek gerekir ki arayüzler içerisindeki metod tanımlamalarında soyut sınıflarda kullandığımız gibi abstract anahtar sözcüğünü kullanamıyoruz. Nedeni ise arayüzlerin içerisindeki tüm metodların zaten abstract olarak değerlendirilmesidir. Dilin mimarisini oluşturanlar ayrıca bir daha abstract tanımlama yapılmasını gerekli görmemişler. Eğer yazarsanız hata mesajı ile karşılaşırsınız.
  • Bir diğer nokta ise arayüz içerisinde yapılan tüm metod tanımlamaları için bir erişim belirleyicisinin kullanılamayacağıdır. Varsayılan erişim belirteci olarak public seçilmiştir ve sizin bunu değiştirme şansınız da yoktur. Eğer bir metodun erişim belirleyicisini değiştirip örneğin private gibi bir erişim belirteci verebilseydiniz türeyen sınıflarda bu metodları override edebilmek imkansız olacaktır. Bu da arayüzler içerisindeki tüm metod tanımlamaları türeyen sınıflarda override edilmelidir ilkesi ile çelişecektir. Tabi ki metodların dönüş bildirim değerlerinin olmayacağı anlamına gelmemektedir ve bu ikisi birbirinden ayrı şeylerdir.Arayüzler içerisinde metodlar haricinde global alanlar da tanımlayabildiğimizi söylemiştik. Erişim belirleyicisi olarak bu alanlarlar da yine public olarak değerlendirmektedir. Bunu da sizin değiştirme şansınız yoktur. Ayrıca alanlara static ve final erişim belirteci de eklenmiştir, metodlardan farklı olarak. Tabiki bunlar arayüzler içerisinde birebir olrak yazan şeyler değildir. Yazılmasa dahi varsayılan olarak kabul görmektedirler.
  • Soyut sınıflardan başka soyut sınıflar türetebiliyorduk. Bu böyle arda arda devam edip gitmekteydi. Yine hatırlarsanız türeyen soyut sınıflarda, türedikleri soyut sınıf içerisinde yer alan soyut metodları override etme gibi bir zorunluluk da yoktu. Aynısı arayüzler için de geçerlidir. Arayüzler de başka arayüzlerden türeyebilmektedir ve bu özellik de arayüzler arasında da kalıtım ilişkisinin kurulabilmesini sağlamaktadır.

Bu birkaç önemli noktanın üzerinde durduktan sonra şimdi biraz daha uygulamaya dönük birşeyler yapabiliriz artık. Uygulama demişken Java'da arayüzler interface anahtar sözcüğü ile tanımlanmakta ve implements anahtar sözcüğü ile de uygulanmaktadır. Aşağıdaki örnekte yukarıda bahsettiğimiz bu birkaç özellik ile ilgili bir uygulama vermekteyim.Fazlası...

JAVA - Packages(Paketler) kavramı nedir?

by Cem Kefeli 15. Ekim 2009 00:22

JavaDiyelim ki bir başka eve taşınacaksınız. Yani kolileri hazırlama vakti geldi çattı... İlk iş gidip koli bulmak olur heralde, sonra da eşyaları bu kollerin içine düzgün ve anlamlı bir şekilde yerleştirmek. Nasıl yerleştiririz ki acaba? Kırılabilecek mutfak eşyalarını bir koliye, giyecekleri bir koliye, temizlik malzemelerini bir ya da birden çok koliye koyarsak hem daha düzenli olurlar hem de aradığımızı daha kolay bulabiliriz heralde.

Buraya kadar olan kısım, olaya bir girişti aslında. Wink Fakat bu koli paketlerinin mantığının java'da kullanılan paket kavramından hiç bir farklılığı yok. Temel olarak özetlemek gerekirse; Java'da paketler, aynı amaç üzerinde çalışan kod bloklarını bir araya toparlayabilmemiz için kullanılmaktadır. Java'da oluşturulan paketler 'package paket_ismi;' notasyonu ile belirtilmektedir. Bununla ilgili örnek vereceğim ilerleyen satırlarda. Aslında C# kullananların yakından tanıdığı namespace kavramından hiçbir farkı yoktur Java'daki paket kavramının. Oluşan paketlerin kullanılabilmesi için ise import anahtar sözcüğü kullanılmaktadır. Bu da C#'daki using anahtar sözcüğüne karşılık düşmektedir.
Az önce aynı amaç için kullanılan kod parçacıklarının bir araya toparlanmasından bahsetmiştik. Örneğin IO ve math birer paket örneğidirler. IO paketi java'da kullanılan dosya girdi/çıktı işlemleri için yapılabilecek gerekli sınıfları bulundurmaktadır. Yani temel işlevi dosya girdi/çıktı işlemlerin yapılabilmesidir. Math paketi ise matematik işlemlerinin yapılabilmesinden sorumludur ve kullanılabilecek neredeyse tüm matematik işlemlerini bulundurmaktadır. Bu örnekler paketlerinin içeriğinin ne kadar güzel hazırlandığı ve tüm bu aynı amaca hizmet eden kodların nasıl bir araya toplandığına güzel bir örnektir. Paketlerin isimlerinin de güzelce seçilmesi çok önemlidir. Çünkü isimleri içeriklerinin ne olduğunu ve hangi özelleşmiş yapıları barındırdığını güzel bir şekilde anımsatmalıdır.

Aşağda verdiğim örnekte bir paketin uygulamamız tarafından nasıl kullanılabileceğini göstermekteyim.

Main.java  |  Netbeans Projesini indir Packages1.rar (12,43 kb)  |  Gizle  |  Göster
import java.io.*;
import java.math.*;

/**
 *
 * @author Cem KEFELİ
 * http://www.cemkefeli.com
 */
public class Main
{
    public static void main(String[] args)
    {
        // Matematik işlemleri
        double Sayi1 = 5.0;
        double Sayi2 = 3.0;
        double Sayi3;
        Sayi3 = Math.pow(Sayi1, Sayi2);
        System.out.println("Sayi1= "+Sayi1+", Sayi2= "+Sayi2+", Sayi1^Sayi2= "+Sayi3+"");
        //
        // Dosya İşlemleri
        try
        {
            // Dosyayı oluştur
            FileWriter fstream = new FileWriter("out.txt");
            BufferedWriter out = new BufferedWriter(fstream);
            out.write("Merhaba dosya");
            //Output stream'i kapat
            out.close();
        }
        catch (Exception e) //Catch exception if any
        {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

Fazlası...

JAVA - Java 2 Enterprise Edition (J2EE)

by Cem Kefeli 5. Ekim 2009 05:20

JavaYıllar önce J2EE teknolojisinin duyurulması ile birlikte klasik web yaşantımız oldukça fazla değişikliğe uğradı. Daha önceleri iki katmanlı olarak hizmet veren uygulamalar daha çok katmana yayılarak performansı, işletilebilirliği ve ölçeklenebilirliği arttırıldı. Daha sağlam ve daha güvenilir sistemler oluşturulmaya başlandı. Bu yazımda başlarda da söylediğim web teknolojisine yeni bir soluk getiren J2EE teknolojisinden kısaca bahsedeceğim.

Öncelikle şunu belirtmeliyim ki J2EE kısaltması içerisinde geçen '2' rakamı J2EE için bir versiyon numarası ifade etmemektedir. Java platformunun kendisi için bir teknoloji numarası belirtmektedir. J2EE için ayrıca versiyon numaraları vardır ve 2001 yılında 1.3 versiyonu ile başlayıp günümüze kadar 6.0'a kadar uzanmıştır. Aynı şekilde J2SE(Java 2 Standard Edition) ve J2ME(Java 2 Micro Edition) için de farklı farklı versiyon numaraları vardır. J2EE 1.4 ten sonra artık Java EE 5.0 olarak anılmaya başlanmıştır ve versiyon isimlendirilmesinde bazı farklılıklar oluşmuştur.

Java EE, uygulama geliştiricilerden fazlasıyla geri besleme almış ve çok fazla yankı bulmuştur. Çünkü sunduğu yapı şimdiye kadar sunulan klasik web teknolojisi yapılarından oldukça farklıdır. Daha önceleri iki, bazen üç, katmanlı olarak gerçekleştirilen uygulamalara çok katmanlı yapı mimarisi oturtulmuştur. Artık web uygulamalarının çok katmandan oluşabilmesi mümkün olmuştur bu teknolojiler ile.

Java 2 Enterprise Edition Multi-Tier ArchitectureÖnceleri sunucu(server)-istemci(client) taraflı, yani iki katmanlı, programlama tekniğini oldukça fazla sevdik. Sunucuda çalışan bir uygulama, ki bu genelde sunucuda host edilen bir veritabanı olacaktır, ve istemcilerde çalışan ve sunuculardan veri toparlayıp işleyen farklı bir uygulama. Bu ikisi bir araya geldiğinde ise uzaktan veritabanı işlemlerini kolaylıkla gerçekleştirebileceğiniz güzel bir uygulama ortaya çıkıyor. Fakat ortada şöyle bir problem var. Asıl işlemleri her zaman istemciler yapıyor ve iş yükünün çok büyük bir bölümü istemcilerin üzerine kalıyor. Acaba bu yük başka platformlar tarafından da paylaşılarak azaltılabilir mi? Evet azaltılabilir, zaten de tüm yapılan mimari değişiklikleri bunu sağlamaya yönelik artık son yıllarda. Bir başka problem ise uygulamanın kullanıcılara sunulmasında ortaya çıkan sorunlar. Bunun nedeni ise masaüstü uygulaması şeklinde dağıtılan ve kullanıcılar tarafından kullanılan yazılımların güncellenebilirliğinin sıkıntılı olması. Siz yaptığınız her bir güncelleme için bir üst versiyonu kullanıcılara dağıtmalı ve herbiri için tekrar kurulum gerçekleştirmelisiniz ki bu problemi aşabilesiniz. Bir diğer problem de uygulamayı kullanan kullanıcı sayısının artması durumunda sunucu makinenin yetersiz kalması. Tek çare ise uygulama sunucusunu daha güçlü bir makine ile değiştirmek. Ya da sisteme başka makineler ekleyerek ana makinenin işlem yükünü paylaştırabilmek. Fazlası...

Hakkımda...

Cem KEFELİ

Electronics and
Telecommunication Eng.
devamı...


Son yapılan yorumlar...

Comment RSS

Yasal bir uyarı...

Disclaimer"Bu web sitesinde görmüş olduğunuz bilgilerin, dokümanların ve diğer materyallerin kullanılmasından doğabilecek hiç bir sorumluluktan site sahibi sorumlu tutulamaz. Web sitesi içerisinde yer alan yazılar, yorumlar, resimler ve diğer tüm içerikler yalnızca sahibinin görüşünü yansıtmakta olup içeriğin sahibi kişilerin çalıştığı kurumları bağlayıcı hiç bir nitelik taşımamaktadır. Yapılan tüm alıntılar mutlaka kaynak gösterilerek verilmeye çalışılmaktadır. Web sitesi içerisinde bulunan ilgili materyaller, ilgili yasal kurumlar tarafından uygun görülmemesi durumda kaldırılacaktır."
General