Các cấu trúc có vị trí của chúng, ngay cả trong Java. Bạn chỉ nên sử dụng chúng nếu hai điều sau đây là đúng:
- Bạn chỉ cần tổng hợp dữ liệu không có bất kỳ hành vi nào, ví dụ: truyền như một tham số
- Nó không quan trọng một chút về loại giá trị mà dữ liệu tổng hợp có
Nếu đây là trường hợp, thì bạn nên đặt các trường công khai và bỏ qua các getters / setters. Getters và setters dù sao cũng khó hiểu và Java thật ngớ ngẩn vì không có các thuộc tính như một ngôn ngữ hữu ích. Vì đối tượng giống như cấu trúc của bạn không nên có bất kỳ phương thức nào, các trường công khai có ý nghĩa nhất.
Tuy nhiên, nếu một trong hai không áp dụng, bạn đang giao dịch với một lớp thực sự. Điều đó có nghĩa là tất cả các lĩnh vực nên riêng tư. (Nếu bạn thực sự cần một trường ở phạm vi dễ tiếp cận hơn, hãy sử dụng getter / setter.)
Để kiểm tra xem cấu trúc được cho là của bạn có hành vi hay không, hãy xem khi các trường được sử dụng. Nếu nó có vẻ vi phạm , đừng hỏi , sau đó bạn cần chuyển hành vi đó vào lớp của mình.
Nếu một số dữ liệu của bạn không nên thay đổi, thì bạn cần phải làm cho tất cả các trường đó là cuối cùng. Bạn có thể xem xét làm cho lớp học của bạn bất biến . Nếu bạn cần xác thực dữ liệu của mình, sau đó cung cấp xác thực trong setters và constructor. (Một mẹo hữu ích là xác định một setter riêng và sửa đổi trường của bạn trong lớp chỉ bằng cách sử dụng setter đó.)
Ví dụ Chai của bạn rất có thể sẽ thất bại cả hai bài kiểm tra. Bạn có thể có (mã) giống như thế này:
public double calculateVolumeAsCylinder(Bottle bottle) {
return bottle.height * (bottle.diameter / 2.0) * Math.PI);
}
Thay vào đó nên
double volume = bottle.calculateVolumeAsCylinder();
Nếu bạn thay đổi chiều cao và đường kính, nó sẽ là cùng một chai? Chắc là không. Những người nên được cuối cùng. Là một giá trị âm ok cho đường kính? Chai của bạn phải cao hơn chiều rộng? Cap có thể là null? Không? Làm thế nào bạn xác nhận điều này? Giả sử khách hàng là ngu ngốc hoặc xấu xa. ( Không thể nói sự khác biệt. ) Bạn cần kiểm tra các giá trị này.
Đây là lớp Chai mới của bạn có thể trông như thế nào:
public class Bottle {
private final int height, diameter;
private Cap capType;
public Bottle(final int height, final int diameter, final Cap capType) {
if (diameter < 1) throw new IllegalArgumentException("diameter must be positive");
if (height < diameter) throw new IllegalArgumentException("bottle must be taller than its diameter");
setCapType(capType);
this.height = height;
this.diameter = diameter;
}
public double getVolumeAsCylinder() {
return height * (diameter / 2.0) * Math.PI;
}
public void setCapType(final Cap capType) {
if (capType == null) throw new NullPointerException("capType cannot be null");
this.capType = capType;
}
// potentially more methods...
}