2012-03-13 5 views
2

모든 변수와 상황에서 getter와 setter를 사용하는 것이 좋습니다.getter 및 setter를 사용하지 않는 경우가 있습니까?

나는 그들이 너무 내가이 상황에서 그들을 떠나거나 나쁜 관행이다 할 수 알고 싶어 코드가 길고 어색하고 있습니다 보인다 여기 상황이 그러나

...

내가 가지고있는 다음 클래스 -

public class Conversation { 

    class Message 
    { 
     private int id; 
     private int senderId; 
     private Timestamp timeSent; 
     private String text; 
    } 

    private int conversationId; 
    private int userIdA; 
    private int userIdB; 
    private ArrayList<Message> messages = new ArrayList<Message>(); 
... 
... (Getters and setters for members of Conversation) 
... 
} 

그래서 대화 멤버 변수에 getters 및 setter를 사용하고 있습니다. 그러나 나는 그것들을 내부 클래스 Message, variables에 사용하고 싶지 않다. 필러 코드에 약 30 줄을 추가하는 것만으로 훨씬 어색해 보입니다. 그래서 그들을 여기에 두는 것은 나쁜 습관입니까? 나는 또한 Message 변수를 결코 편집하지 않을 것이며, 생성자 Message (..., ..., ..., ...)에 대한 호출로 설정 될 것이고 그 후에 그들은 단지 읽혀질 것입니다. 따라서 게터를 제외하는 것이 좋습니다.하지만 세터는 어떻게해야합니까?

+4

편집하지 않을 경우 마지막으로 선언 할 수 있습니다. –

+0

http://stackoverflow.com/questions/565095/java-are-getters-and-setters-evil – assylias

+1

또한 대화 클래스에서만 Message 클래스를 사용하려는 경우 Message private을 선언하고 any를 생략 할 수 있습니다 Message 클래스 내부의 수정 자에 접근한다. –

답변

3

Message이 비공개 인 경우 필드를 직접 사용하면 아무런 문제가 없습니다. 내부 - 세부 구조체 일 뿐이므로 캡슐화 문제는 없습니다 (외부 클래스는 모든 내부 클래스의 private 변수를 볼 수 있기 때문에).

그러나 Message은 package-private입니다. 패키지의 모든 사용자는 해당 필드를 볼 수도 있습니다. 이것은 공개 된 API가 아니기 때문에 회색 영역입니다. 그러나 패키지의 크기에 따라 캡슐화가 필요합니다. 예를 들어, 큰 패키지이고 다른 클래스가 Message에 따라 시작하는 경우 (아무도 수행하지 않으면 private으로 만들 수 있음) Message의 내부를 변경하려면 캡슐화 문제가 발생할 수 있습니다. 그래서, 그것은 판결 전화입니다.

Message이 공개 된 경우 나는 게터를 제공한다고 분명히 말할 것입니다.

Btw 여기에서 MessagePOD으로 사용하는 경우 static으로 설정해야합니다. 일반적으로 static은 그렇지 않은 것보다 낫습니다.

2

모든 변수와 상황에 사용하기 위해 게터와 세터를 사용하는 것이 좋습니다.

글쎄, 모두 neveralways 규칙이 잘못되었습니다. 이 것을 제외합니다. :)

getter와 setter는 표준적인 방법이므로 사용하면 안됩니다. 예를 들어, 클래스 Point2d에 2 명의 멤버 xy이있는 경우 접근자를 사용하지 않았을 수 있습니다.

자신에게 물어야합니다. 코드 내에서 회원이 많이 바뀌겠습니까? 디버깅이 쉽고 내가 멤버를 변경하는 곳을 볼 수 있습니까? 대답이 '예'일 경우 확실히 접근자를 필요로합니다. 그렇지 않으면 코드를 더 읽기 쉽고 유지하기 쉽게 만드는 것은 무엇이든 논쟁의 여지가 있습니다.

+1

프로그래밍 과정의 첫 번째 라인을 훔칠 것입니다. :) – madth3

1

그들이

new Message(int,int,Timestamp, String) 

에서 설정되고 필드가 변경되지 않습니다 경우가 가장 좋습니다 방법을 얻을 수 있습니다.

get 메소드 만 있으면 읽기 전용으로 만드는 제약이 있습니다.

관련 문제