public
필드를 사용하지 마십시오
public
클래스의 내부 동작을 실제로 래핑하려는 경우 필드를 사용하지 마십시오 . 가지고 java.io.BufferedReader
예를 들어. 다음과 같은 필드가 있습니다.
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLF
모든 읽기 방법으로 읽고 씁니다. 별도의 스레드에서 실행되는 외부 클래스 skipLF
가 읽기 도중에 상태를 악의적으로 수정 한 경우 어떻게됩니까? BufferedReader
확실히 haywire 갈 것입니다.
public
필드를 사용하십시오
이 Point
수업을 예로 들어 보겠습니다.
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;
}
}
이로 인해 두 점 사이의 거리를 계산하는 것이 매우 고통 스럽습니다.
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));
이 클래스에는 일반 게터 및 세터 이외의 동작이 없습니다. 클래스는 단지 데이터 구조를 나타내며,이없는, 때 공공 필드를 사용하는 것이 허용 하고 행동을 (얇은 getter와 setter가되어주지 않습니다 적이 없습니다 여기에 행동으로 간주). 이 방법으로 더 잘 작성할 수 있습니다.
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));
깨끗한!
그러나 수업에 행동이 없어야 할뿐만 아니라 미래에도 행동을 취할 이유 가 없어야 합니다.
(이 답변 이 정확히 설명하는 내용입니다. "Java 프로그래밍 언어에 대한 코드 규칙 : 10. 프로그래밍 실습" 을 인용 하십시오 .
적절한 퍼블릭 인스턴스 변수의 한 예는 클래스가 기본적으로 데이터 구조이며 동작이없는 경우입니다. 즉, struct
클래스 대신 (Java가 지원되는 경우 struct
)을 사용했다면 클래스의 인스턴스 변수를 public으로 만드는 것이 적절합니다.
따라서 공식 문서 도이 관행을 받아들입니다.)
또한 위 Point
클래스의 멤버를 변경할 수 없다고 확신하는 경우 final
키워드를 추가 하여 적용 할 수 있습니다 .
public final double x;
public final double y;