Structs는 Java에서도 사용할 수 있습니다. 다음 두 가지에 해당하는 경우에만 사용해야합니다.
- 동작이없는 데이터를 집계하면됩니다 (예 : 매개 변수로 전달).
- 집계 데이터에 어떤 종류의 값이 있는지는 중요하지 않습니다.
이 경우 필드를 공개하고 게터 / 세터를 건너 뛰어야합니다. 어쨌든 게터와 세터는 어수선하고 자바는 유용한 언어와 같은 속성을 가지고 있지 않기 때문에 바보입니다. 구조체와 같은 객체에는 어쨌든 메서드가 없어야하므로 공공 필드가 가장 적합합니다.
그러나 그 중 하나가 적용되지 않으면 실제 수업을 처리하는 것입니다. 즉, 모든 필드는 비공개이어야합니다. (더 접근하기 쉬운 범위의 필드가 절대적으로 필요한 경우 게터 / 세터를 사용하십시오.)
가정 구조에 동작이 있는지 확인하려면 필드가 사용되는시기를 확인하십시오. 그것을 위반하는 것 같으면 묻지 말고 그 행동을 수업으로 옮겨야합니다.
일부 데이터가 변경되지 않아야하는 경우 모든 필드를 최종적으로 만들어야합니다. 클래스를 불변으로 만드는 것을 고려할 수 있습니다 . 데이터의 유효성을 검증해야하는 경우 setter 및 생성자에서 유효성 검증을 제공하십시오. 유용한 유용한 방법은 개인 설정자를 정의하고 해당 설정 자만 사용하여 클래스 내에서 필드를 수정하는 것입니다.
병 예제는 두 테스트에 모두 실패합니다. 다음과 같은 코드를 만들 수 있습니다.
public double calculateVolumeAsCylinder(Bottle bottle) {
return bottle.height * (bottle.diameter / 2.0) * Math.PI);
}
대신에
double volume = bottle.calculateVolumeAsCylinder();
높이와 직경을 변경 한 경우 동일한 병입니까? 아마 아닙니다. 그것들은 최종적이어야합니다. 직경이 음수 값입니까? 병이 너비보다 커야합니까? 캡이 null 일 수 있습니까? 아니? 이것을 어떻게 확인합니까? 내담자가 멍청하거나 사악하다고 가정하자. ( 차이를 말하는 것은 불가능합니다. )이 값을 확인해야합니다.
새 병 클래스는 다음과 같습니다.
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...
}