CodeGym /Java Blogu /Rastgele /Alıcılar ve ayarlayıcılar
John Squirrels
Seviye
San Francisco

Alıcılar ve ayarlayıcılar

grupta yayınlandı
Merhaba! Önceki derslerde, kendi tam teşekküllü sınıflarınızı yöntemler ve alanlarla nasıl ilan edeceğinizi zaten öğrendiniz. Bugünün dersinde, Java'daki Getters ve Setters hakkında konuşacağız. Bu ciddi bir gelişme, aferin! Ama şimdi size tatsız bir gerçeği söylemek zorundayım. Sınıflarımızı doğru beyan etmedik! Neden? İlk bakışta, aşağıdaki sınıfın herhangi bir hatası yok:

public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}
Ama öyle. İşyerinde oturduğunuzu hayal edin ve kedileri temsil etmek için bu Cat sınıfını yazın. Ve sonra eve gidersin. Siz yokken, başka bir programcı işe gelir. Yazdığınız Cat sınıfını kullanmaya başladığı kendi Ana sınıfını oluşturur .

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
Neden yaptığı ve nasıl olduğu önemli değil (belki adam yorgundur veya yeterince uyumamıştır). Önemli olan bir şey daha var: Mevcut Cat sınıfımız, alanlara kesinlikle çılgınca değerler atanmasına izin veriyor. Sonuç olarak, program geçersiz durumdaki nesnelere sahiptir (örneğin -1000 yaşında olan bu kedi). Peki sınıfımızı bildirirken nasıl bir hata yaptık? Sınıfımızın verilerini açığa çıkardık. İsim, yaş ve kilo alanları herkese açıktır. Bunlara programın herhangi bir yerinden erişilebilir: basitçe bir Cat nesnesi oluşturun ve herhangi bir programcının nokta ( . ) operatörü aracılığıyla verilerine doğrudan erişimi olur.

Cat cat = new Cat();
cat.name = "";
Burada doğrudan name alanına erişiyor ve değerini ayarlıyoruz. Verilerimizi uygunsuz dış müdahalelerden bir şekilde korumamız gerekiyor. Bunu yapmak için neye ihtiyacımız var? İlk olarak, tüm örnek değişkenler (alanlar) özel değiştirici ile işaretlenmelidir. Özel, Java'daki en katı erişim değiştiricisidir. Bunu yaptığınızda, Cat sınıfının alanlarına sınıf dışından erişilemez.

public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";//error! The Cat class's name field is private!
   }
}
Derleyici bunu görür ve hemen bir hata üretir. Şimdi alanlar bir nevi korunuyor. Ancak, erişimi belki de çok sıkı bir şekilde kapattığımız ortaya çıktı: ihtiyacınız olsa bile programda mevcut bir kedinin ağırlığını alamazsınız. Bu da bir seçenek değil. Olduğu gibi, sınıfımız esasen kullanılamaz. İdeal olarak, bir tür sınırlı erişime izin vermemiz gerekir:
  • Diğer programcılar Cat nesneleri oluşturabilmelidir
  • Mevcut nesnelerden veri okuyabilmelidirler (örneğin, mevcut bir kedinin adını veya yaşını alabilirler)
  • Alan değerleri atamak da mümkün olmalıdır. Ancak bunu yaparken yalnızca geçerli değerlere izin verilmelidir. Nesnelerimiz geçersiz değerlerden korunmalıdır (örn. age = -1000, vb.).
Bu iyi bir gereksinim listesi! Gerçekte, tüm bunlar alıcı ve ayarlayıcı adı verilen özel yöntemlerle kolayca elde edilir.
Alıcılar ve ayarlayıcılar - 2
Bu isimler "get" (yani "bir alanın değerini alma yöntemi") ve "set"ten (yani "bir alanın değerini belirleme yöntemi") gelir. Cat sınıfımızda nasıl göründüklerine bakalım :

public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       this.weight = weight;
   }
}
Gördüğünüz gibi oldukça basit görünüyorlar :) Adları genellikle "get"/"set" artı ilgili alanın adından oluşur. Örneğin, getWeight() yöntemi çağrıldığı nesnenin ağırlık alanının değerini döndürür. Bir programda şöyle görünür:

public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       String smudgeName = smudge.getName();
       int smudgeAge = smudge.getAge();
       int smudgeWeight = smudge.getWeight();

       System.out.println("Cat's name: " + smudgeName);
       System.out.println("Cat's age: " + smudgeAge);
       System.out.println("Cat's weight: " + smudgeWeight);
   }
}
Konsol çıktısı:
Cat's name: Smudge
Cat's age: 5
Cat's weight: 4
Artık başka bir sınıf ( Main ), Cat alanlarına erişebilir , ancak yalnızca alıcılar aracılığıyla. Alıcıların genel erişim değiştiricisine sahip olduğuna, yani programın herhangi bir yerinden erişilebilir olduklarına dikkat edin. Peki ya değer atamak? Setter metodları bunun içindir

public void setName(String name) {
   this.name = name;
}
Gördüğünüz gibi, onlar da basit. Bir Cat nesnesinde setName() yöntemini çağırırız , argüman olarak bir dize iletiriz ve dize, nesnenin ad alanına atanır.

public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);

       System.out.println("Cat's original name: " + smudge.getName());
       smudge.setName("Mr. Smudge");
       System.out.println("Cat's new name: " + smudge.getName());
   }
}
Burada hem alıcıları hem de ayarlayıcıları kullanıyoruz. İlk olarak, kedinin orijinal adını almak ve görüntülemek için bir alıcı kullanıyoruz. Ardından, yeni bir ad ("Bay Smudge") atamak için bir ayarlayıcı kullanırız. Ve sonra adı almak için (gerçekten değişip değişmediğini kontrol etmek için) alıcıyı bir kez daha kullanırız. Konsol çıktısı:
Cat's original name: Smudge
Cat's new name: Mr. Smudge
Peki fark nedir? Ayarlayıcılarımız olsa bile alanlara geçersiz değerler atayabiliriz:

public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       smudge.setAge(-1000);

       System.out.println("Smudge's age: " + smudge.getAge());
   }
}
Konsol çıktısı:
Smudge's age: -1000 years
Aradaki fark, ayarlayıcının tam teşekküllü bir yöntem olmasıdır. Ve bir alanın aksine, bir yöntem, kabul edilemez değerleri önlemek için gerekli olan doğrulama mantığını yazmanıza izin verir. Örneğin, negatif bir sayının yaş olarak atanmasını kolayca engelleyebilirsiniz:

public void setAge(int age) {
   if (age >= 0) {
       this.age = age;
   } else {
       System.out.println("Error! Age can't be negative!");
   }
}
Ve şimdi kodumuz doğru çalışıyor!

public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       smudge.setAge(-1000);

       System.out.println("Smudge's age: " + smudge.getAge());
   }
}
Konsol çıktısı:
Error! Age can't be negative!
Smudge's age: 5 years
Ayarlayıcının içinde, bizi geçersiz veri ayarlama girişiminden koruyan bir kısıtlama oluşturduk. Smudge'ın yaşı değişmedi. Her zaman alıcılar ve ayarlayıcılar oluşturmalısınız. Alanlarınızın hangi değerleri alabileceği konusunda herhangi bir kısıtlama olmasa bile, bu yardımcı yöntemlerin hiçbir zararı olmayacaktır. Şu durumu hayal edin: siz ve meslektaşlarınız birlikte bir program yazıyorsunuz. Ortak alanlarla bir Cat sınıfı yaratırsınız . Tüm programcılar onları istedikleri gibi kullanıyor. Ve sonra güzel bir gün şunu fark edersiniz: "Saçmalık, er ya da geç birisi yanlışlıkla ağırlığa negatif bir sayı atayabilir! Pasörler yaratmalı ve tüm alanları özel yapmalıyız!" Tam da bunu yaparsınız ve iş arkadaşlarınızın yazdığı tüm kodları anında kırarsınız. Sonuçta, onlarCat alanları doğrudan.

cat.name = "Behemoth";
Ve şimdi alanlar özel ve derleyici bir sürü hata veriyor!

cat.name = "Behemoth";//error! The Cat class's name field is private!
Bu durumda alanları gizlemek ve en baştan alıcı ve ayarlayıcılar oluşturmak daha iyi olacaktır. Tüm meslektaşlarınız onları kullanırdı. Ve alan değerlerini bir şekilde kısıtlamanız gerektiğini geç fark ettiyseniz, çeki ayarlayıcının içine yazmış olabilirsiniz. Ve kimsenin kodu kırılmayacaktı. Elbette, bir alana erişimin yalnızca "salt okunur" olmasını istiyorsanız, bunun için yalnızca bir alıcı oluşturabilirsiniz. Yalnızca yöntemler harici olarak kullanılabilir olmalıdır (yani sınıfınızın dışında). Veriler gizlenmelidir. Bir cep telefonuyla kıyaslama yapabiliriz. Her zamanki kapalı cep telefonu yerine, size her türlü çıkıntılı kablo, devre vb. İle açık kasası olan bir telefon verildiğini hayal edin. arama yapabilmek. Ama sen'
Alıcılar ve ayarlayıcılar - 3
Bunun yerine, üretici size bir arayüz verir: kullanıcı sadece doğru rakamları girer, yeşil çağrı düğmesine basar ve çağrı başlar. İçeride devreler ve kablolarla ne olduğu veya işlerini nasıl yaptıkları umurunda değil. Bu örnekte şirket, telefonun "iç kısımlarına" (verilerine) erişimi sınırlandırıyor ve yalnızca bir arabirimi (yöntemler) gösteriyor. Sonuç olarak, kullanıcı istediğini elde eder (arama yapma yeteneği) ve kesinlikle içindeki hiçbir şeyi kırmaz. Öğrendiklerinizi pekiştirmek için Java Kursumuzdan bir video dersi izlemenizi öneririz.
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION