publicAlanları kullanma
publicBir sınıfın iç davranışını gerçekten sarmak istediğinizde alanları kullanmayın . java.io.BufferedReaderÖrneğin ele alalım. Aşağıdaki alana sahiptir:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLFtüm okuma yöntemlerinde okunur ve yazılır. Ayrı bir iş parçacığında çalışan bir dış sınıf skipLF, okumanın ortasında durumunu kötü bir şekilde değiştirirse ne olur ? BufferedReaderkesinlikle haywire gidecek.
publicAlanları kullanma
Örneğin bu Pointsınıfı ele alalım:
class Point {
private double x;
private double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return this.x;
}
public double getY() {
return this.y;
}
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
}
Bu, iki nokta arasındaki mesafenin hesaplanmasını çok acı verici hale getirecektir.
Point a = new Point(5.0, 4.0);
Point b = new Point(4.0, 9.0);
double distance = Math.sqrt(Math.pow(b.getX() - a.getX(), 2) + Math.pow(b.getY() - a.getY(), 2));
Sınıfın düz alıcılar ve ayarlayıcılar dışında herhangi bir davranışı yoktur. Sınıf yalnızca bir veri yapısını temsil ettiğinde ve hiç davranmadığında ve hiçbir zaman davranışa sahip olmadığında ortak alanları kullanmak kabul edilebilir (ince alıcılar ve ayarlayıcılar burada davranış olarak kabul edilmez ). Bu şekilde daha iyi yazılabilir:
class Point {
public double x;
public double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
Point a = new Point(5.0, 4.0);
Point b = new Point(4.0, 9.0);
double distance = Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));
Temiz!
Ancak unutmayın: Sadece sınıfınız davranışlardan yoksun olmakla kalmamalı, aynı zamanda gelecekte de davranmak için hiçbir nedene sahip olmamalıdır .
(Bu cevap tam olarak budur . "Java Programlama Dili için Kod Kuralları: 10. Programlama Uygulamaları" nı belirtmek için :
Uygun halka açık değişkenlerin bir örneği, sınıfın temelde davranışsız bir veri yapısı olduğu durumdur. Başka bir deyişle, structsınıf yerine bir tane kullanırsanız (Java destekli ise)struct ) kullanırsanız, sınıfın örnek değişkenlerini herkese açık hale getirmek uygun olur.
Dolayısıyla resmi belgeler de bu uygulamayı kabul etmektedir.)
Ayrıca, yukarıdaki Pointsınıftaki üyelerin değişmez olması gerektiğinden eminseniz, finalbunu uygulamak için anahtar kelime ekleyebilirsiniz :
public final double x;
public final double y;