"Merhaba, Amigo!"
"Merhaba, Bilaabo!"
"Bugün size Java'daki birkaç anahtar kelimeden bahsedeceğim. Ama en ilginç olanla başlayacağım: final anahtar kelimesi. "
" Bir değişken, yöntem veya sınıf bildirirken final anahtar sözcüğünü kullanabilirsiniz ."
"Ve neden finale ihtiyacımız var?"
"Oldukça basit. Bir değişkeni final olarak işaretlersek, değiştirilemez hale gelir:"
final int i = 5;
i++; //Compilation error: the value of i cannot be changed.
"Anlıyorum."
"Bir yöntemi final olarak işaretlersek, türetilmiş sınıflarda yöntemi geçersiz kılmak yasaktır:"
class Cat
{
public final String getName()
{
return "cat";
}
}
class Tiger extends Cat
{
public String getName() //Compilation error: overriding the getName()
{
return "tiger";
}
}
"Anlıyorum. Ama bir yöntemi geçersiz kılmayı neden yasaklayasın ki?"
"Örnek olarak, bir programcının bir yöntemde çok sayıda önemli kod yazdığını ve sınıfını miras alan tüm sınıfların belirtilen davranışa sahip olacağını garanti etmek istediğini varsayalım."
"Ve son olarak, üçüncü kullanım."
"Bir sınıfı final anahtar kelimesiyle işaretlersek, o sınıf miras alınamaz."
public final class Cat
{
public String getName()
{
return "cat";
}
}
class Tiger extends Cat //Compilation error: the Cat class cannot be
{
public String getName()
{
return "tiger";
}
}
"Ve neden bir sınıfın miras alınmasını engelleyelim?"
"Kalıtımın sinir bozucu olmasını engellemediğimizi anlamalısınız, bunun yerine güvenlik ve kod bütünlüğü adına. Sınıf mirası yasak değilse, o zaman buna izin verildiği anlamına gelir. tasarımcı, bu sınıfın nesneleri için olduğu kadar türetilmiş sınıfların nesneleri için de düzgün çalışacaktır."
"Ancak bir geliştirici, sınıfındaki küçük değişikliklerin bile her şeyin beklendiği gibi çalışmamasına neden olacağını fark ederse, mirası yasaklamak daha iyidir."
"Örneğin, String sınıfı, tüm ilkel türler gibi nihai olarak bildirilir: Tamsayı, Boolean, Double, Karakter..."
"Ah, anladım. String sınıfı değişmez bir sınıf olarak yaratıldı ve birdenbire değişebilirlerse pek çok şey çalışmayı durdurur."
"Pekala, neredeyse. Şunu söyleyelim: her şey neredeyse eskisi gibi çalışacaktı, ancak bazen bulması ve anlaması çok zor olan hatalar olabilirdi. Bu nedenle, bazı durumlarda, sınıfları veya yöntemleri miras almak gerçekten bir günah değildir. ancak yasaklamak, daha sonra yakalanacak daha az hata anlamına gelir."
"Nihai başka nerede kullanabilirsiniz?"
"Final'ı işlev parametrelerinden önce ve bir yöntemdeki değişkenlerden önce kullanabilirsiniz. İşte bir örnek:"
public void setName(final String name)
{
final String displayName = "Mr."+ name;
…
this.name = displayName;
}
"Peki bunun anlamı ne?"
"İki tane var. İlk olarak, diğer geliştiricilere bu değerin yalnızca bir değişken değil, belirli bir sabit olduğunu söylemek istiyorsak, bir değişkeni final olarak ilan ederiz."
Örneğin, satış vergisini bir fiyata göre hesaplamak istiyoruz:
public int getPriceNDS()
{
final int NDS = 20;
return this.price * NDS / 200;
}
"İkincisi, yerel veya anonim iç sınıflar yazarken bu tür değişkenlere ihtiyacımız var. Size bu tür sınıflardan birazdan bahsedeceğim. Ama bugün değil."
"Tamam, şimdiye kadar çok karmaşık bir şey olmadı."
"Lütfen yalnızca değişkenin değiştirilemez hale geldiğini unutmayın, atıfta bulunabileceği bir nesne değil. Nesne yine de değiştirilebilir."
"Aslında tam da bunu sormak üzereydim. Ve nesneyi değiştirilemez yapmanın bir yolu yok mu?"
"Değişmez bir sınıf yazmadığınız sürece hayır."
"Son bir değişkenin değeri değiştirilemediğinden, başlangıç değerini hemen atamanız gerektiğini lütfen unutmayın."
Bu kod derlenecek | Bu kod derlenmeyecek |
---|---|
|
|
"Ancak, bununla birlikte Java, bir sınıfın son değişkenlerinin başlatılmasını yapıcıya kadar geciktirmenize izin verir."
Bu kod derlenecek | Bu kod derlenmeyecek |
---|---|
|
|
"Ayrıca, farklı oluşturucular nihai değişkenleri farklı değerlerle başlatabilir. Bu oldukça uygundur:"
class Home
{
private final int width;
private final int height;
public Home()
{
height = 100;
width = 200;
}
public Home(int width)
{
this.height = 300;
this.width = width;
}
public Home(int width, int height)
{
this.height = height;
this.width = width;
}
}
"Bu gerçekten ilginç bir konuydu ve kesinlikle her şey mantıklı. Teşekkürler Bilaabo!"
GO TO FULL VERSION