- En iyi cevaplar
- 98
Erişim Değiştiricileri
Erişim değiştiricileri (Access modifiers), Java'da bir classa ve onun içerisinde bulunan öğelere / üyelere bir erişim seviyesi vermemizi ve dışarıdan - gereksiz - erişimi engellememize yarar. Fakat buna rağmen dışarıdan erişim tamamen engellenemez, bu yüzden gereksiz olarak tanımladım. Bu konuya Reflection adı altında değineceğiz.
Erişim değiştiricileri Java'da 4 adettir. Bunlar;
1. Public
2. Protected
3. Package-Protected (Varsayılan)
4. Private
Public
Public, herkese açık demektir. Yani herkes erişebilir. Public Java'daki en geniş erişim değiştiricisidir.
Protected
Protected, sadece aynı package (adres / alan adı) üzerinden veya bir subclass tarafından erişime izin verir. Yani mesela java.lang.Object classı bir public classtır, fakat mesela java.lang.Object#finalize methodu protected erişim değiştiricisine sahip olduğu için, siz java.lang adlı pakette olmayan bir classtan da - onu extendleyerek, her class varsayılan olarak java.lang.Object'i extendlediği için siz extendlemesinizde olur - finalize methodunu override edebilir veya super.finalize() şeklinde erişebilirsiniz.
Ek Not: Sub-package'ler Protected veya Package-Protected üyelere erişemez. Mesela com.lifemcserver paketinde olan bir üyeye - eğer protected veya package protected ise - com.lifemcserver.test paketinden erişemeyiz. Tam tersini yaparsak yine erişemeyiz. Burada sub-package benim verdiğim bir ad. Paket ismi aynı değil sonuçta.
Package-Protected
Protected ile aynıdır. Tek farkı subclasslardan erişime izin vermez. Bu erişim değiştiricisi varsayılandır (bazı istisnalar dışında, mesela bir interface'de her üye varsayılan olarak public olur). Bir keywordu yoktur. Yani eğer bunu kullanmak istiyor iseniz protected, public, private vb. hiçbir şey yazmayacaksınız ve varsayılan olarak bu gelecek. Protected ile karıştırmayın.
Private
Private, o üyenin sadece bulunduğu class içerisinde erişilebileceğini tanımlar. Protected veya Package-Protected'dan farkı ise o paketteki herkes yerine, sadece o üyenin bulunduğu classtan erişime izin verilir. Java'daki en katı erişim değiştiricisi Private'dir.
Reflection
Reflection, Java'nın bize normalde erişemediğimiz üyelere erişmemiz için sunduğu bir güzelliktir. Güzelliğinin yanı sıra tabii ki normal erişime göre çok daha yavaştır ve eğer çok gerekli değil ise kullanılmamalıdır. Reflection tabii ki sadece erişilemeyen şeylere erişmek için değil mesela runtime'da (çalışma zamanında) kullanıcıdan alınan veriye göre işlem yapmak için vesaire de kullanılabilir.
Mesela normalde bir public static methodu ClassAdı.methodAdı(); şeklinde yürütüyor isek Reflection ile ClassAdı.getDeclaredMethod("methodAdı").invoke(...); şeklinde yürütürüz. Üç nokta koyduğum kısma method argümanları veya method static değil ise instance girebiliriz, örnek olduğu için üç nokta koydum. Burada methodAdı runtime da alınabilecek bir veri de olabileceği için, çalışma zamanında ki değerlere göre işlemler yapabiliriz.
Kısaca Reflection güzeldir, bize özgürlük sağlar, fakat yavaştır. Hatta çoğu yerde çoğu zaman bad-magic olarak geçer. Bugünkü NMS kullanan ve normal Bukkit API'si ile mümkün olmayan şeyleri yapan çoğu eklenti de Reflection kullanılarak yapılmıştır. Bu genelde hissedilmese de bir yavaşlık sağlar tabii ki. Doğru kullanıldığında çokta problem çıkarmayacaktır fakat yine de direk erişim kadar güvenli ve hızlı olmayacaktır.
Diğer Konular
Java - Nedir bu NullPointerException?
Java - Nedir bu static ve this?
Java - Kullandığım ve önerdiğim araçlar
Java - Tüm hataları yakalamak
Erişim değiştiricileri (Access modifiers), Java'da bir classa ve onun içerisinde bulunan öğelere / üyelere bir erişim seviyesi vermemizi ve dışarıdan - gereksiz - erişimi engellememize yarar. Fakat buna rağmen dışarıdan erişim tamamen engellenemez, bu yüzden gereksiz olarak tanımladım. Bu konuya Reflection adı altında değineceğiz.
Erişim değiştiricileri Java'da 4 adettir. Bunlar;
1. Public
2. Protected
3. Package-Protected (Varsayılan)
4. Private
Public
Public, herkese açık demektir. Yani herkes erişebilir. Public Java'daki en geniş erişim değiştiricisidir.
Protected
Protected, sadece aynı package (adres / alan adı) üzerinden veya bir subclass tarafından erişime izin verir. Yani mesela java.lang.Object classı bir public classtır, fakat mesela java.lang.Object#finalize methodu protected erişim değiştiricisine sahip olduğu için, siz java.lang adlı pakette olmayan bir classtan da - onu extendleyerek, her class varsayılan olarak java.lang.Object'i extendlediği için siz extendlemesinizde olur - finalize methodunu override edebilir veya super.finalize() şeklinde erişebilirsiniz.
Ek Not: Sub-package'ler Protected veya Package-Protected üyelere erişemez. Mesela com.lifemcserver paketinde olan bir üyeye - eğer protected veya package protected ise - com.lifemcserver.test paketinden erişemeyiz. Tam tersini yaparsak yine erişemeyiz. Burada sub-package benim verdiğim bir ad. Paket ismi aynı değil sonuçta.
Package-Protected
Protected ile aynıdır. Tek farkı subclasslardan erişime izin vermez. Bu erişim değiştiricisi varsayılandır (bazı istisnalar dışında, mesela bir interface'de her üye varsayılan olarak public olur). Bir keywordu yoktur. Yani eğer bunu kullanmak istiyor iseniz protected, public, private vb. hiçbir şey yazmayacaksınız ve varsayılan olarak bu gelecek. Protected ile karıştırmayın.
Private
Private, o üyenin sadece bulunduğu class içerisinde erişilebileceğini tanımlar. Protected veya Package-Protected'dan farkı ise o paketteki herkes yerine, sadece o üyenin bulunduğu classtan erişime izin verilir. Java'daki en katı erişim değiştiricisi Private'dir.
Reflection
Reflection, Java'nın bize normalde erişemediğimiz üyelere erişmemiz için sunduğu bir güzelliktir. Güzelliğinin yanı sıra tabii ki normal erişime göre çok daha yavaştır ve eğer çok gerekli değil ise kullanılmamalıdır. Reflection tabii ki sadece erişilemeyen şeylere erişmek için değil mesela runtime'da (çalışma zamanında) kullanıcıdan alınan veriye göre işlem yapmak için vesaire de kullanılabilir.
Mesela normalde bir public static methodu ClassAdı.methodAdı(); şeklinde yürütüyor isek Reflection ile ClassAdı.getDeclaredMethod("methodAdı").invoke(...); şeklinde yürütürüz. Üç nokta koyduğum kısma method argümanları veya method static değil ise instance girebiliriz, örnek olduğu için üç nokta koydum. Burada methodAdı runtime da alınabilecek bir veri de olabileceği için, çalışma zamanında ki değerlere göre işlemler yapabiliriz.
Kısaca Reflection güzeldir, bize özgürlük sağlar, fakat yavaştır. Hatta çoğu yerde çoğu zaman bad-magic olarak geçer. Bugünkü NMS kullanan ve normal Bukkit API'si ile mümkün olmayan şeyleri yapan çoğu eklenti de Reflection kullanılarak yapılmıştır. Bu genelde hissedilmese de bir yavaşlık sağlar tabii ki. Doğru kullanıldığında çokta problem çıkarmayacaktır fakat yine de direk erişim kadar güvenli ve hızlı olmayacaktır.
Diğer Konular
Java - Nedir bu NullPointerException?
Java - Nedir bu static ve this?
Java - Kullandığım ve önerdiğim araçlar
Java - Tüm hataları yakalamak