Java Günlüğüm
Yazılım, Java, BT, azıcık felsefe, biraz mizah...
  • Udemy Eğitimleri
  • Temiz Kod
  • Tasarım Kalıpları
  • Hakkımda
  • Arşiv
RSS
20 Haziran 2015

Java SE Workshop’ın 1. Oturumu Yapıldı

Akin Eğitim ve Seminer

Java SE Workshop‘ın 1. oturumu yapıldı. İlk oturumda, Java SE kullanılarak gerçekleştirilecek olan ATM simulasyonu projesinin yazılım ihtiyaçları ve tasarımı üzerinden gidildi. Gerçekleştirilecek sistemin Yazılım Mühendisliği prensiplerine uyarak sistemli bir şekilde bina edilmesi hedeflenmektedir. Bu amaçla sistemin önce kullanım şekilleri (use case) ile diğer fonksiyonel ihtiyaçlar yanında fonksiyonel olmayan ihtiyaçları da ele alındı. Sonrasında sistemin mimari ve fonksiyonel tasarımı üzerine konuşuldu. Nihayetinde kod seviyesinde bazı detaylar ele alınarak ilk oturum tamamlandı.

İlk oturumun videosunu burada seyredebilirsiniz.

İyi seyirler.

Toplam görüntülenme sayısı: 986

12 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
05 Haziran 2015

Arayüzlerde Varsayılan Metotlar (Default Methods) – II

Akin Java

Bir önceki yazıda arayüzlerdeki bir gerçekleştirmeye sahip olan metotlara giriş yapmıştık.

Java SE 8 ile birlikte gelen, arayüzlerde varsayılan metot kullanımı, default method, işin içine girdikçe kafamızı karıştırmaya devam edecek gibi görünüyor. Bende hep öyle olur. Bir konuyu öğrenirken başta çok karmaşık gibi gelmez ama sıklıkla, ilerlemeyle birlikte durum çetrefilleşir ve olmadık yerlere çıkar. Bu durum tabi olarak büyük keyif verir, zekanızı zorlar, sizi düşünmeye iter ama geldiğiniz noktanın acaipliği hep aklınızda kalır.

Bakın arayüzlerde default metot kullanımının bizi getirdiği yere. Hangisinden başlayalım? Çoklu mirası (multiple inheritance) ele alalım önce.

C++’tan bilirim, eğer bir alt sınıf, aynı virtual olmayan metoda sahip iki sınıftan miras devralıp da o metodu override etmezlerse, probleminiz var demektir. Eski zamanlardan hatırladığım şey bu duruma “diamond problem” ya da “deadly diamond of death” dendiği. Java’da bir sınıftan devralma anlamında çoklu mirasa izin verilmeyişi, sadece arayüzlerden devralma anlamında çoklu mirasın söz konusu oluşu, bu problemi şu ana kadar ertelemişti. Ama arayüzlere default metot koyunca durum değişti. Bakın, Artist bir arayüzümüz ile onun alt arayüzleri olan Actor ve Musician arayüzlerimiz olsun:

package org.javaturk.oofp.ch04.multipleInheritance;

public interface Artist {
	
	void play();
}
package org.javaturk.oofp.ch04.multipleInheritance;

public interface Actor extends Artist{
	
	default void play(){
		System.out.println("Actor plays!");
	}
}
package org.javaturk.oofp.ch04.multipleInheritance;

public interface Musician extends Artist{
	
	default void play(){
		System.out.println("Musician plays!");
	}
}

Yukarıdaki henüz tamamlanmamış elması, Actor ve Musician arayüzlerininden devralan ama “play()” metoduna bir gerçekleştirme vermeyen MusicianActor sınıfı ile tamamlayalım:

package org.javaturk.oofp.ch04.multipleInheritance;

public class MusicianActor implements Actor, Musician{

}

Diamond Problem

 

 

MusicianActor‘ün araryüzünde “play()” metodu var ama hangi gerçekleştirmeye sahip? Gelinen noktada, “diamond problem” ile karşılaştık. Bu durumda MusicianActor sınıfı derlenmeyecektir. Bunu çözmenin yöntemi ise ancak MusicianActor‘ün “play()” metoduna bir gerçekleştirme vermesidir.

package org.javaturk.oofp.ch04.multipleInheritance;

public class MusicianActor implements Actor, Musician{
	
	public void play(){
		System.out.println("MusicianActor plays!");
	}
}

Dolayısıyla default metotlara sahip olmanın ilk maliyeti, diamond problemine duçar olmaktır.

Default metotlarla alakalı bir başka durum ise, üst bir arayüzün default metot tanımlamasına karşın, onun alt arayüzünün aynı metodu abstract olarak tekrar tanımlamasında oluşur. Yukarıda verdiğimiz örneği biraz değiştirerek devam edebiliriz. Bu defa Actor, play() metodunu default olarak tanımlar:

package org.javaturk.oofp.ch04.multipleInheritance.v2;

public interface Artist {
	
	default void play(){
		System.out.println("Artist plays!");
	}
}

Ve tek alt arayüzleri olarak Musician ise “play()” metodunu abstract olarak tekrar tanımlarlar:

package org.javaturk.oofp.ch04.multipleInheritance.v2;

public interface Musician extends Artist{
	
	void play();
}

Tabi olarak bu durumda, hiyerarşinin en altındaki Pianist sınıfı “play” metoduna bir gerçekleştirme sağlamak zorundadır, aksi taktirde abstract bir sınıf olur. Pianist‘i abstract yapalım:

package org.javaturk.oofp.ch04.multipleInheritance.v2;

public abstract class Pianist implements Musician{	
}

 

Garip bir hiyerarşi!

Geçmiş olsun 🙂 Herkese iyi günler dileriiim, iyi hafta sonlarııııı 🙂

Üst arayüz Artist ile Musician ve Pianist arasındaki ilişkiye bir bakın. Farkedebildiniz mi?

Gariplik şurada: “interface” anahtar kelimesiyle oluşturduğumuz arayüzler, bir önceki yazıda da vurguladığım gibi sadece davranışların tanıtımının (declaration) yapıldığı yerlerdir. Davranışların tam olarak tanımlandığı (definition) yer değildir, davranışlar arayüzlerde tanıtılır, sınıflarda tanımlanır. Bu yüzden bu yapılara, sadece arayüz sağladığı için “arayüz” ya da “interface” denir. Ama yukarıdaki durumda tanımlamayı yapan arayüzdür, tanıtımı yapan ise sınıf! “play()” metodu Artist arayüzünde tam olarak tanımlanıyor ama hiyerarşinin en altındaki Pianist sınıfı ise aynı davranışı tanıtıyor, yani üst tipi olan Mucisian arayüzünden abstract olarak devralıyor ama bir gerçekleştirme vermiyor.

Ne demiş atalarımız böyle durumlarda: “Ne oldum demeyeceksin, ne olacağım diyeceksin.” ya da “büyük lokma ye büyük laf konuşma.”

Bol düşünmeli bir haftasonu dilerim 🙂

Toplam görüntülenme sayısı: 756

14 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
05 Haziran 2015

Arayüzlerde Varsayılan Metotlar (Default Methods) – I

Akin Java

Java SE 8, son zamanlardaki en fazla değişiklik içeren ve bundan dolayı da heyecan getiren Java SE sürümü oldu. Çünkü Java SE 8 ile gelen değişiklikler, abartmayayım ama, bazı konulardaki düşüncemizi kökten değiştiren cinsten.

Tabi dillerde değişiklik yapmak, hele temel mekanizmalarıyla oynamak kolay değil. Örneğin switch ifadelerinde String kullanımı için senelerce beklemiştik. Benzer şey Java’ya fonksiyonel özelliklerin eklenmesinde de oldu. Java SE 8’i, Java SE 1.2 ve 5.0 gibi, diğerleri arasında öne çıkan sürümlerden olması, Java’ya, çehresini değiştirecek fonksiyonel yapılar katmasıyla ilgili. Ve muhtemelen en çarpıcı olan değişiklik ise arayüzlerin (interfaces) artık gerçekleştirmesi olan metotlara sahip olması.

Malum, arayüz, kavramsal olarak da Java’da “interface” anahtar kelimesiyle ifade edilen yapı olarak da sadece şekil sağlayan, bir davranışın “neliği”ni ifade eden, “nasıllığı”nı, onu gerçekleştiren sınıflara bırakan bir yapıdır. Bu anlamda arayüze, İngilizce’de “contract” de denir. “program to an interface, not an implementation” ya da “design by contract” gibi felsefe ve yaklaşımlar hep arayüz kavram ve mekanizmalarının ifade ettiği soyutluk üzerine bina edilmişlerdir.

Durum böyle iken Java SE 8’de, arayüzlerin bir gerçekleştirmeye yani koda sahip metotları içermesi mümkün hale geldi. Artık Java’da bir arayüz sadece soyut (abstract) metotlara değil,  default (varsayılan) ve statik metotlara da sahip olabilir.

Default metotlar metot arayüzünde “default” anahtar kelimesi ile tanımlanır ve arayüzdeki soyut metotların aksine bir gerçekleştirmeye sahip olmaları zorunludur.

public interface Printable {
	
	void view();
	
	void print();
	
	default void format(){
		System.out.println("Printable is being formatted.");
	}
}

 

Bu durumda Printable arayüzünden miras alan sınıfların default olan format() metoduna bir gerçekleştirme vermeleri gerekmeyecektir. Çünkü bu metodun Printable arayüzünden devir alınan hali zaten bir gerçekleştirmeye sahiptir.

public class Document implements Printable {

	@Override
	public void view() {
		System.out.println("Document is being viewed.");
	}

	@Override
	public void print() {
		System.out.println("Document is being printed.");
	}
}

 

Yukarıdaki kodun, yazının basında bahsettiğim arayüz kavramına alışkın bir zihinde karışıklığa neden olacağı kesin gibidir. Anlamayı kolaylaştırmak için neden böyle bir şeye ihtiyaç duyulduğunu hızlıca açıklayalım.

Eğer projenizde kullandığınız bir arayüze yeni bir metot ekleyip, onu derledikten sonra .class dosyasını projenizdeki yerine koyarsanız, tekrar derlemediğiniz müddetçe, o arayüzü kullanan, örneğin gerçekleştiren (implement eden), sınıflar çalışmaya devam ederler. Buna “binary compatibility” (ikili uyumluluk) denir. Ama o arayüzü kullanan bir sınıfı tekrar derlemeye kalkarsanız, örneğin bir hatasını düzelttikten sonra, derleme hatası alırsınız çünkü bu durumda source compatibility (kaynak uyumluluğu) yoktur.

Arayüzlerde default olarak tanımlanan ve bir gerçekleştirmeye sahip olan metotlar, arayüzlerin eski sürümlerini kullanan sınıflar ile arayüzün default metotlarla zenginleştirilmiş yeni sürümü arasında kaynak uyumluluğu sağlamak amacına hizmet etmektedir. Diğer bir deyişle, bir arayüze yeni bir metot eklediğinizde, o arayüzden miras devir alan sınıfların tekrar derlenmeleri halinde derleme hatası vermemeleri için yapmaları gereken, arayüzdeki yeni metotlara bir gerçekleştirme sağlama zorunluluğundan kurtulmanın yolu, arayüze eklenen metotları default olarak tanımlamak ve bir gerçekleştirme vermektir.

Statik metotlar ise, bildiğimiz, sınıflarda tanımlanan statik metotlarla aynı yapıdadırlar. Arayüzlerdeki statik metotların tek farkı devir alınmayıp, sadece ve sadece tanımlandığı arayüz üzerinden çağrılabilmesi kısıtıdır. Örnekle açıklayalım:

package org.javaturk.oofp.ch04.staticMethods;

public interface Printable {
	
	void view();
	
	void print();
	
	default void format(){
		System.out.println("Printable is being formatted.");
	}
	
	static void startPrinting(){
		System.out.println("Printing has been started.");
	}
}

 

package org.javaturk.oofp.ch04.staticMethods;

public class Document implements Printable {

	@Override
	public void view() {
		System.out.println("Document is being viewed.");
	}

	@Override
	public void print() {
		System.out.println("Document is being printed.");
	}
}

Bu durumda test sınıfımız şöyle olacaktır:

package org.javaturk.oofp.ch04.staticMethods;

public class TestDefaultMethods {

	public static void main(String[] args) {
		Printable printable = new Document();
		printable.print();
		printable.format();
		
		Printable.startPrinting();
		
//		Document.startPrinting();  // Can't do this!
	}
}

Yukarıdaki örnekte “Document.startPrinting();” satırının problemli olduğuna dikkatinizi çekmek isterim.

Arayüzlerde tanımlanan tüm metotlar, soyut, default ya da statik olsun, her zaman public erişim belirtecine varsayılan halde sahiptirler.

Bir sonraki yazıda kafanızı hepten karıştırmak üzere 🙂

Toplam görüntülenme sayısı: 1103

13 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
04 Haziran 2015

Java SE Workshop Başlıyor

Akin Eğitim ve Seminer Java, Java SE Workshop

Java öğrenirken yeterince pratik yapamamaktan şikayetçi olanlar için Java SE Workshop başlıyor. Sadece Java SE bilgisi kullanılarak yapılacak bu workshop ya da atölye çalışmasında bir ATM (Automated Teller Machine) simulasyonu gerçekleştirilecektir. Geliştirilecek olan proje, çala-kalem kodlamaya girmek yerine, Yazılım Mühendisliği süreçlerine uygun bir şekilde, ihtiyaçların ele alınmasından başlayacak ve mimari ve fonksiyonel tasarımdan sonra kodlamaya geçilecektir. Kodlama sırasında temiz kod yazma prensiplerine de uyulacaktır. Workshop Planı

Projede Java SE bilgisini geliştirmek yanında, birim testi (unit test), JavaDoc ile arayüz dokümantasyonu, temiz kod yazma prensipleri gibi teknik ve yaklaşımlar da uygulanacaktır. Dolayısıyla gerçek bir yazılım projesi Java ile nasıl yapılırı merak edenler için proje iyi bir öğrenme imkanı sunacaktır.

Workshopın 10 haftalık detaylı içeriği yanda verilmiştir, üzerine tıklayarak büyütebilirsiniz. Daha geniş bilgiye de buradan ulaşabilirsiniz.

Bol Java’ı günler dilerim.

Toplam görüntülenme sayısı: 1249

6 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
«< 13 14 15 16 17 >»

Günlüğüme Hoşgeldiniz

Bu günlükte, Yazılım Mühendisliği, Bilgi Teknolojileri, Java, kişisel gelişim ve zaman zaman da diğer konulardaki düşüncelerimi sizlerle paylaşacağım. Umarım beğenir ve hoşça vakit geçirirsiniz.

Her türlü düşüncenizi, yorum olsun, beğeni ya da eleştiri olsun, bana iletmenizi rica ediyorum sizden. Ayrıca bana akin@javaturk.org adresinden ya da Twitter'dan ulaşabilirsiniz. Videolarıma da buradan ulaşabilirsiniz.

Teşekkür ederim.

Akın Kaldıroğlu

Rahat Okumak İçin

A Decrease font size. A Reset font size. A Increase font size.

Sosyal Medya

  • Twitter
  • Facebook
  • LinkedIn
  • Youtube

Son Twitlerim

→ Takip Etmek İçin

Abone Olun

Emalinizi girerek yazılardan haberdar olun.
Loading

Son Yazılarım

  • Udemy Eğitimlerim Üzerine
  • (başlıksız)
  • Clean Code / Temiz Kod Eğitimi Udemy’de
  • Java ile Nesne-Merkezli Programlamaya Giriş Eğitimi Udemy’de
  • Selsoft Video Eğitimleri
  • Spring ile Kurumsal Yazılım Geliştirme
  • Corona Günlerinde Design Patterns
  • Corona Günlerinde Java
  • JDK 10 ve “var” Özelliği
  • Onur Özcan
  • Analist ve İş Bilgisi
  • Farklı Dillerin Bakış Açısıyla Nesne-Merkezli Programlama
  • Java Nedir?
  • Bilgi Teknolojilerinde Yetenek Yönetimi – II: Tanımlar ve Eleştiriler – I
  • Alelade Hikayeler – II: Bir Başka Performans Problemi

Yazı Kategorileri

Yazı Takvimi

Ekim 2026
P S Ç P C C P
 1234
567891011
12131415161718
19202122232425
262728293031  
« May    

Yazı Arşivi

Blogroll

  • Binnur Kurt'un Günlüğü
  • Ender'in Java Blogu
  • Erdem Seherler
  • Kızımın Günlüğü
  • Kurumsal Java
  • Levent Karagöl
  • Levent'in Java Blogu
  • Mert Can Akkan’s java tips,options, news…
  • Yaşar Safkan
  • Yasin Saygılı
  • Yazı Dünyası

Son Yazılar

  • Udemy Eğitimlerim Üzerine
  • (başlıksız)
  • Clean Code / Temiz Kod Eğitimi Udemy’de
  • Java ile Nesne-Merkezli Programlamaya Giriş Eğitimi Udemy’de
  • Selsoft Video Eğitimleri

Son yorumlar

  • Hakkımda için Android Öğrenirken Takip Etmeniz Gereken Yazılımcılar - TalentGrid
  • Analist ve İş Bilgisi için Akin
  • Analist ve İş Bilgisi için Taner Kandemir
  • Bilgi Teknolojilerinde Yetenek Yönetimi – II: Tanımlar ve Eleştiriler – I için Akin
  • Bilgi Teknolojilerinde Yetenek Yönetimi – II: Tanımlar ve Eleştiriler – I için Şahin Yelkenci

Arşivler

  • Mayıs 2021
  • Mart 2021
  • Eylül 2020
  • Nisan 2020
  • Mart 2018
  • Şubat 2018
  • Aralık 2017
  • Kasım 2017
  • Ekim 2017
  • Eylül 2017
  • Ağustos 2017
  • Mayıs 2017
  • Aralık 2016
  • Eylül 2016
  • Şubat 2016
  • Ocak 2016
  • Aralık 2015
  • Ekim 2015
  • Eylül 2015
  • Ağustos 2015
  • Haziran 2015
  • Mayıs 2015
  • Nisan 2015
  • Mart 2015
  • Şubat 2015
  • Ocak 2015
  • Aralık 2014
  • Kasım 2014
  • Ekim 2014
  • Eylül 2014
  • Ağustos 2014
  • Temmuz 2014
  • Haziran 2014
  • Mayıs 2014
  • Nisan 2014
  • Mart 2014
  • Şubat 2014
  • Ocak 2014
  • Aralık 2013
  • Kasım 2013
  • Ekim 2013
  • Eylül 2013
  • Temmuz 2013
  • Haziran 2013
  • Nisan 2013
  • Ağustos 2012
  • Temmuz 2012
  • Haziran 2012
  • Nisan 2012
  • Mart 2012
  • Şubat 2012
  • Ekim 2011
  • Eylül 2011
  • Ağustos 2011
  • Haziran 2011
  • Mayıs 2011
  • Mart 2011
  • Şubat 2011
  • Ocak 2011
  • Aralık 2010
  • Kasım 2010
  • Eylül 2010
  • Ağustos 2010
  • Temmuz 2010
  • Haziran 2010
  • Mayıs 2010
  • Ocak 2010
  • Aralık 2009
  • Kasım 2009
  • Ekim 2009

Kategoriler

  • Bilgisayar Bilimleri
  • BT
  • Diğer
  • Eğitim ve Seminer
  • Hikayeler
  • İş ve İhtiyaç Analizi
  • Java
  • Java Dersleri
  • Java EE
  • Kariyer
  • Kategorisiz
  • Kitaplar
  • Kültür, Bilgi ve Düşünce
  • Oracle
  • Performans
  • Programlama
  • Tasarım Kalıpları
  • TEGEP
  • Yazılım Kalitesi ve Test
  • Yazılım Modelleme
  • Yazılım Mühendisliği
  • Yetenek Yönetimi

Üst veri

  • Oturum aç
  • Kayıt akışı
  • Yorum akışı
  • WordPress.org

Recent Photos

Abone Olun

Emalinizi girerek yazılardan haberdar olun.
Loading

Yazı Etiketleri

analiz Bilmek C Desen design pattern EJB Eğitim Fortran Hibernate Java Java'ya nasil baslarim Java dersleri Java EE Java Persistence API Java SE Java Sertifika Java Öğren Java öğreniyorum Java öğrenmek JPA Kalıp Kurumsal Java nesne nesne-merkezli No Silver Bullet object object-oriented Oracle Java Certifications pattern performans programlama programlama dilleri programlama nedir sertifika singleton tasarım tasarım deseni tasarım desenleri tasarım şablonu yazılım yazılım geliştirme Yazılım Mühendisliği yazılımın doğası yazılımın zorlukları Şablon

↑

© Java Günlüğüm 2026
Powered by WordPress • Themify WordPress Themes
 

Yorumlar Yükleniyor...