Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Size ufak bir Java sorusu


Mirage

Öne çıkan mesajlar

B extends A diyelim,

B foo yu override ederse, A nın consturctorında yapması gereken isler yalan olur.

o yüzden private yapabilirsin..

amaaa..

yapmayabilirsin de..

ne yapmak istedigine baglı bişi bu..

edit: gerçi B nin override etmesini istedigin durumlarda. A nın altında bi sub class daha yaratp o methodu abstract yapıp A da override etmek en dogrusudur.
B de davranısı degistirmek istersen B de override edebilir böylece.
Link to comment
Sosyal ağlarda paylaş

Neyse herkesi çatlatmadan ben açıklıyayım bari. Şimdi gördüğünüz üzere A class'ına bakan kimse bir hata görmüyor. Doğrudan bir hata yok zaten.

Sonra kalkıp başka biri A'yı extend eden bir class yazıyor. Doğal olarak bazı metodları da kendine göre override ediyor. Şekil 1a:


public class B extends A {

private SuperBirTip tip;

public B(SuperBirTip tip) {
this.tip = tip;
}

@Override
public void foo() {
System.out.println(tip.toString());
}

}


Bakalım bu class'a bakınca hatayı görecek misiniz? :)

Edik: şimdi ona da takılmayın diye public/private ekledim
Link to comment
Sosyal ağlarda paylaş

Mum_Chamber said:

sorun constructor'dan direkt metod cagirmak

cunku adam override ettiginde bir degiskene erismeye calismis. fakat new B() olarak cagirilinca da foo()'yu calistirmaya calisacak, ama tip degiskeni tanimlanmamis olacak


bingo :)

Ceday said:

cık sorun A da :)

B nin foo yu override etmesini önlemek icin private yapmalı.


Bunu baştan söyleseydin tamam derdim ama sen metod dışardan çağırılması saçma olur diye private yap demişsin, ki bunun sorunla bir ilgisi yok.

Ceday said:

kodsal bi hata yok ama, private yapman lazım mantıken. print methodunun cagrılması dısardan sacma olur.


Beklediğim cevap şuydu: "Constructor içinde virtual (override edilmesi mümkün olan) metod çağırmak tehlikelidir."

Metodu private yapmak sorunun oluşmasını engelliyor tabi. Ama her metodu kafana göre private/public yapamazsın. O metod dışarıdan çağırılması düşünülerek yazılmışsa public yapmak zorundasın. O yüzden ilk yanıtımda metodun isteyerek public yazıldığını söylemiştim. Yoksa olayın esprisi kalmıyor zaten.

Constructor içinde virtual metod çağırdığın anda, o metod override edilirse, daha hiç bir field'i initialize edilmemiş bir nesnenin metodunu çağırmış oluyorsun. Bu da benzer hatalara yol açıyor.

Mesela B class'ındaki 'foo' metodunu yazan kişi 'tip' field'inin null olmadığını düşünmekte haklı sayılabilir. Çünkü B constructor'unda 'tip'e bir atama yapıyor. Ama A constructor'unda 'foo' metodu çağrıldığı için daha o atama gerçekleşemeden 'foo' metoduna girmiş oluyorsun.

Sorun A'da mı peki? O da tartışılır. Asıl sorun Java'nın bu tip hatalara karşı bir önlem almamasında belki de.
Link to comment
Sosyal ağlarda paylaş

javada her fonksiyon virtual olduğundan tehlikeli tabi.

"final" keyword'ü kullanabilirsiniz non-virtual yapmak için. tam çalışmasını bilmiyorum ama açıklamalarda non-virtual fonksiyon define etmek için kullanılır yazılmış.

yani burada amaç önemli. hata yok aslında, herşey nasıl kullanmak istediğine göre değişir. belki de o printin sen override edilmesini istiyorsun.

eğer hata diye düşünüyorsanız bunu, hadi tehlike diyelim, "virtual function" kendisi tamamen tehlike olmuyor mu

olay tamamen nasıl implement etmek istediğiniz...
Link to comment
Sosyal ağlarda paylaş

Private metodlar da virtual değil. Override edilemiyorlar sonuçta.

Ceday said:

B nin foo yu override etmesini önlemek icin private yapmalı.


Ama burda dediğin gibi override etmesin diye private yapmak yanlış vidayı döndürmek bence. Brigand'ın dediği gibi, override etmesini önlemek isteyen final yapar metodu. Private yapılacaksa dışardan erişilmesini önlemek için yapılmalı, override edilmemesi için değil.

Ceday said:

sorun javayla alakalı deil ki.
her dilde var bu olay.


Her dilde olması şart değil. Çoğu dilde mümkün doğru, ama bu tür sorunları önlemeyi sağlayan mekanizmalar da var. Yarın katılacağım bir seminerde bu sistemleri sunuyorum. Seminer paper'ım buna çözüm getiren sistemlerden birini anlatıyor. İlgilenen varsa:

Masked Types for Sound Object Initialization

Bu konuyu açmamın sebebi de bunla ilgili küçük bir deney yapmaktı aslında. Nerdeyse kimse bu class'lara tek başına baktığında bir sorun olduğunu düşünmüyor. Yıllarca Java tecrübesi olan, işlerinde prof. olarak Java kullanan kişiler de bir sorun göremedi. Ancak iki class'ı yanyana verip, "bak bakalım sorun nerde" dediğin bulabiliyorlar.
Link to comment
Sosyal ağlarda paylaş

yani şimdi şöle.

constructarda kullandıgın methodların private olmasında fayda var.

ama illa ki private yapacagın die birsey de yok. bu senin nasıl birsey design ettigine baglı.

üstte biryerlerde yazdım ama tam anlatamamıs da olabilirim.

atıyorum classında bir List objesi var.

costructorda initalizeList die method vagırıp bunu ArrayList die initialize ediosun.

senin classını extend eden baska bir class da initializeList methoduu override edip List interface'ini impelemente eden baska bir classla initialize ediyor.

bu basit bi örnek oldu, bunu yapmanın baska yolları da var belki ama dedigim gibi bu tamamen senin nasıl birsey design etmeye calısmanla alakalı.

ha belki böle durumlarda public yerine protected kullanırsın o ayrı.
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...