Tostring을 재정의 할 때 Getter 방법을 사용하거나 개인 필드에 직접 액세스하는 것이 더 나은가? [복제하다

StackOverflow https://stackoverflow.com/questions/2073159

  •  20-09-2019
  •  | 
  •  

문제

나는 두 가지 접근법이 모두 사용되는 것을 보았지만 특정한 이유로 한 가지 방법이 다른 방법보다 선호된다는 말을 듣지 못했습니다.

public String toString() {
  return this.field1 + " " + this.field2;
}

~ 대

public String toString() {
  return getField1() + " " + getField2();
}

코드를 간략하게 유지하기 위해 예제에서 문자열 연결을 사용했습니다.

도움이 되었습니까?

해결책

Getters를 사용하십시오.

어쩌면 언젠가는 코드를 변경하여 Getter가 필드 값을 반환 할뿐만 아니라 더 많은 것을 수행하거나 다른 방식으로 결과를 만들 수 있도록 코드를 변경합니다. 그런 다음 게터를 일관되게 사용하게되어 더 행복 할 것입니다.

그러나 평소와 같이, 내 조언에서 얻을 수 있습니다. getter 메소드를 재정의 할 수 있다면 Tostring () 메소드에서 무엇을 기대합니까?

평소와 같이, 그것은 의존하지만, 필드에 직접 액세스할만한 충분한 이유가 없다면 getters를 사용할 것입니다.

다른 팁

액세서 방법을 사용하면 필드의 값을 반환하는 것 외에 추가 로직을 제공하는 경우 (문자열을 어퍼 스케이션하는 것과 같은) 액세서 방법을 선호 할 수 있습니다. 귀하의 수업이 확장되도록 설계되면, 나는 접근자가 무시할 수 있기 때문에 경향이 있습니다.

Tostring에서 Getters를 사용하는 것은 과잉입니다. 그리고 당신은 비 디버그 목적으로 tostring을 사용해서는 안됩니다.

개인 변수에 직접 액세스하는 접근 방식을 선호합니다. IMHO gettter 방법은 혼란을 증가시킵니다.

당신은 가지고 있습니까? 이유 getter 방법을 사용하려면? 그들은 흥미로운 일을합니까?

... 아니면 실제로 필드 자체를 공개하지 않고 내부 데이터를 노출시키는 데 사용하고 있습니까 (가난한 사람의 캡슐화)?

전자라면, 그렇습니다. 후자가 중요하지 않다면 어쨌든 사용하고 싶을 수도 있습니다. 만일을 대비하여 당신은 그들에게 실제 목적을 주지만, 그렇지 않으면 약간의 차이를 만들지는 않습니다.

사용 String.format("%s %s", this.getField1(), this.getField2()); 이 작업을 수행하는 가장 좋은 방법이 될 것입니다. .getXXX() 메소드는 널 참조를 빈 문자열로 변환하거나 개인 인스턴스에 맹목적으로 액세스하여 얻지 못하는 기본값을 원한다는 논리가있을 수 있습니다. 누군가가 와서 논리를 추가 할 경우를 대비하여 가장 안전한 방법입니다. .getXXX() 방법과 그들은 업데이트하려고 생각하지 않습니다 .toString() 구현.

클래스에 필드를위한 getters and setter가있는 경우, Getters와 Setter를 사용하거나 필드에 직접 액세스하는지 여부에 따라 해당 클래스 구현 전반에 걸쳐 일관성이 있어야합니다. 일반적으로 추상화 수준을 혼합하는 것은 의미가 없습니다. 그렇지 않으면 어떤 곳에서는 그렇지 않지만 다른 곳에서는 사용하는 방법을 어떻게 합리화 할 수 있습니까? 또한, 게터가 구현되는 방식에 변화가 있다면 미묘한 가방으로 끝날 수 있습니다. ToString ()은 구현의 일부이므로 일관성이 있어야합니다.

성능 측면에서, 그것은 중요하지 않습니다 - 당신의 사소한 게터와 세터는 어쨌든 최종 방법이어야하므로 어쨌든 감소해야합니다. 그들이 최종적이지 않다면, 당신은 왜 그런지 스스로에게 물어봐야하고 아마도 이것이 당신이 의미하는 일이 아니라면 필드에 직접 액세스하는 것을 피해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top