2013-08-04 3 views
3

자바는 약간 녹슬지 만 (지난 몇 년 동안 C#을 해왔다). 또한 이것이 매우 주관적인 질문이 아니기를 바랍니다.자바 규칙의 게터와 세터

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    // say 10+ properties 
} 

방법에 해당하는 Java 버전과 같습니다

어쨌든 내가 어떤 행동을, (그래, 나는 진부 조금 알고) (C# 버전을) 클래스 Person했다라고? getters와 setters를 많이 작성할 수 있다는 것을 알고 있습니다 (하지만 10 개 이상의 속성이 있다고 말하면됩니다).

public class Person { 
    public String name; 
    public int age; 
    // rest of the stuff here 
} 

나는 이것에 대해 약간의 불안 : 는 할 나쁜 관행으로 간주됩니다. 나는 "정답"이 없다는 것을 알고 있지만, 나는 일반 협약과 모범 사례에 더 관심이 있습니다.

+1

자바에서는'.this' 문을 사용하여'set' 메소드를 나타냅니다. 우리는'return' 문을 사용하여'get' 메소드를 나타냅니다. – Tdorno

+1

Dup http://stackoverflow.com/questions/1907312/java-getters-and-setters? – lreeder

+0

더 나은 아직, 호의 불변성, 모든 분야를 최종 만들고 게터를 제공합니다. –

답변

9

당신은 getter 및 setter를 작성해야합니다. 아니면 IDE가 자동으로 생성하도록하십시오. 그렇지 않으면 캡슐화가 중단됩니다. 또한 게터가 필요할 수도 있습니다.

getter 또는 setter를 사용하는 또 다른 이점은 필드를 반환하거나 설정하기 전에 검사 또는 사전 처리를 수행 할 수 있다는 것입니다.

private String name; 

public String getName() { 
    return this.name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

선택적으로 당신은 http://projectlombok.org/을 사용하고 사용하여이 주석처럼 쓸 수 있습니다 :

@Getter @Setter 
private String name; 

코드 생성은 컴파일 시간을 완료 여기

은 샘플 코드입니다.

+1

감사합니다. 나는 비밀리에 다른 대답을 원했습니다. –

+1

@Dimitar Dimitrov - 상용어를 줄이기 위해'Lombok'이라는 프로젝트가 있습니다. 나는 곧 나의 지위를 편집 할 것이다. –

+1

그리고 캡슐화 외에도 ... 내부 표현을 변경해야하는 경우 더 유연합니다. 내부 getter 메소드 만 변경하면 클라이언트는 내부 표현을 신경 쓰지 않아도됩니다. – nachokk

3

수동 기능을 만들어야합니다.

먼저, 배경 필드를 만듭니다.

private String _backingString 

그런 다음 당신은 getter와 뮤 테이터

public String getBackingString() 
{ 
    return this._backingString; 
} 

public String setBackingString(String value) 
{ 
    this._backingString = value; 
} 

그것은 자바 협약을 생성 - 주위에 다른 방법이 없습니다. 그러나 대부분의 IDE에는이를 생성하는 도구가 있다는 것을 알게되어 기쁩니다. 당신이 가장 좋아하는 IDE 생성기 도구에 대해 그냥 구글 주위에.

You can see this SO question on how to do this in Eclipse.

+0

내가 알아 차렸을 때 이것을 이미 고쳤습니다. :) –

+6

나는 그것이 개인적인 스타일의 문제임을 안다. 그러나이 '_'은 내 눈을 아프게하고 그것은 표준이 아니다. –

+2

C# 개발자를 용서해주십시오. 표준을 알고 있지만 때로는 컨텍스트가 전환 될 때가 너무 커서 내 머리가 미끄러질 수 있습니다. (문자열 대 문자열, 즉 별칭과 유사). –

1

각 getter 및 setter를 수행해야합니다. 최신 IDE는 자동 삽입 옵션을 가지고 있으므로 쉽게 만들 수 있습니다. 결국 캘린더 클래스 스타일로 get 및 set 메소드를 만들 수 있습니다.

0

어떤 IDE를 사용하고 있습니까? 이클립스에서는 소스 메뉴에서 자동으로 생성 할 수 있으며, 이름은 필드 이름에서 파생됩니다. 코드 :

private String myField; 
public String getMyField() 
{ 
    return this.myField; 
} 
public void setMyField(String value) 
{ 
    //validation stuff 
    this.myField = value; 
} 
6

그것은 당신이 필드를 계산하는 방법을 캡슐화 할 수 있도록 필드를 반환하는 게터/세터를하는 것이 좋습니다.잠재적으로 변경 톤이없는

getBalance() 
{ 
    return calculateBalance(); 
} 

그리고 필드 동작을 변경할 자바에있는 유일한 방법 :

getBalance() 
{ 
    return this.staticBalance; 
} 

이것에 : 그것은 드물게 발생하지만이 같은 뭔가를 변경하려는 경우가있을 수도 있습니다 (또는 API 사용자가 대량의 코드를 변경해야하는 경우) getter와 setter를 사용하는 것이 좋습니다. 서브 클래스가 보일러가 지루 쓰기 동작

  • 향상된 스레드 안전을 동기화 할 수 있기 때문에 액세스
  • 를 오버라이드 (override) 할 수

    • 능력,하지만 좋은 IDE는 것입니다 :

      다른 장점은 필드 이름에서 이러한 메소드를 생성 할 수 있습니다.

    +0

    setter와 getter가 필요한 이유를 설명하기 위해 +1 – geby

    +0

    'this.를 제거 할 수 있습니다. –

    +0

    @SteveKuo 필자는 전체 클래스 def를하고 싶지 않았기 때문에 필자가 필드로 두드러지게하기 위해 필드에 'this'를 넣었지만 메서드 호출에는 혼란 스럽다고 동의한다. 메소드 호출에서 삭제했습니다. – lreeder

    1

    저는 종종 getters와 setters를 사용하는 두 가지 방법을 사용합니다. 나는 항상 내 모델에서 getter와 setter를 사용하도록하는 개인 필드를 사용합니다. JPA와 Hibernate를 사용하면 내 모델이 내 DB 스키마에 묶여있다. 그렇다면 RESTful 서비스와 같은 것들에 일반적으로 사용되는 DTO는 getter와 setter가없는 public 필드를 주로 사용한다. 이러한 DTO에는 로직이 없으며 JSON으로 마샬링되거나 클라이언트에서 설정되는 JSON에서 생성되므로 getter 및 setter가 필요하지 않습니다. 나는 보통 이것들에 대해서도 override equals와 hashCode를 끝내지 않는다. 그들은 가능한 한 간단합니다.

    그래서 나는 옳고 그른 방법이 있다고 생각하지 않으며 사용법에 달려 있습니다.

    getter 및 setter를 만들면 IDE에서 작업을 수행 할 수 있습니다.