2014-04-02 3 views
0

이 질문은 구체적인 문제와 관련이 없지만 오히려 일반적인 질문입니다. 값을 설정합니다 인수 목록이있을 것이다 생성자를 작성하여Java에서 객체의 인스턴스 변수를 설정하는 방법은 무엇입니까?

  1. : 클래스를 생성 할 때 자바에서 두 가지 옵션이 그 클래스의 인스턴스 변수에 액세스 할 수 있도록하는 방법을 실제로있다 인스턴스 변수의

  2. 인스턴스 변수 설정을 위해 setters (및 getters) 메소드를 클래스에 추가합니다.

그럼 이제는 어떤 옵션을 사용하는 것이 더 낫습니까? 객체를 생성 할 때 인스턴스 변수를 설정하지 않는 것이 좋은 방법이 아니라는 점을 읽으면서 값을 설정하는 것이 좋습니다. 그게 사실이야? 이 경우 첫 번째 옵션이 더 좋은 옵션으로 보입니다.

+0

상황에 따라 다릅니 까? 일반적으로 1 개 이상의 옵션이있는 경우 모든 상황에 가장 적합한 방법이 없습니다. –

답변

0

개체 생성과 관련이 있다고 생각되면 생성자에 넣으십시오. 예를 들어 정사각형을 만들려면 크기가 필요하지만 색상을 추가하는 것은 필수 사항은 아닙니다 이 경우 길이가 생성자에서 설정되고 색상은 setter 메서드를 통해 설정됩니다.

0

모두 소프트웨어 설계 및 의도에 따라 다르지만 모든 매개 변수를 사용하지 않고 새 객체를 만드는 유스 케이스가 있습니까? 매개 변수 중 일부는 무엇입니까? Getters/Setters 및 기타 내부 메서드는 작업을 수행하기 전에 입력/데이터를 모두 확인해야합니다. 이렇게하면 앞으로 수행하기 전에 수행 한 가정을 검사 할 수 있습니다.

0

생성자의 순수 객체 지향 아이디어는 일관된 상태에있는 인스턴스를 만드는 것입니다. 일관성이없는 인스턴스를 생성 할 수 없도록 만드는 것은 생성자의 책임입니다. 그런 다음 해당 인스턴스의 각 메소드는 인스턴스를 일관된 상태에서 다른 일관된 상태로 전송할 책임이 있습니다.

따라서 항상 모든 입력 매개 변수의 유효성을 검사해야하는 생성자에서 인스턴스 변수를 설정하도록 권장합니다.

일부 인스턴스 변수를 수정할 수있는 경우 설정기를 제공하십시오. 일관된 생각을하기 위해서는 생성자에서 해당 설정기를 사용하십시오! 생성자 오염을 막기 위해 합리적인 기본값을 제공 할 수없는 모든 필수 속성 값을 취하거나 세터를 제공하고 싶지 않은 생성자가 최소한 하나 있어야합니다. 생성자의 값은 생성 후 최종 값이므로이 값을 사용합니다.

0

Constructor 접근 방식을 사용하는 경우 : Ready to Use 객체하려면

.

Setters 개체의 변경 사항.

0

작성 후 값을 변경해야하는 경우가 아니라면 생성자에서 필드를 설정하는 것이 좋습니다. 그 이유는 생성자에서 설정 한 필드 만 immutable으로 만들 수 있기 때문에 불변성은 반성이나 다른 방법으로 클래스를 변경할 수 없기 때문에 매우 좋은 것입니다.

최종 필드의 예 :

public class MyClass { 
    private final int id; 
    public MyClass(int id) { 
     this.id = id; 
    } 

필드는 세터에서 변경 가능, 클래스를 잠글 수있는 유일한 방법 중 하나입니다 수표 등

public void setID(int id) { 
    if(id != -1) { 
     throw new IllegalStateException("Already set!"); 
    } 
    this.id = id; 
} 

을하고 또는 어떻게 든 개체 전체를 잠그면 :

public void lock() { 
    if(getID() == -1) { 
     throw new IllegalStateException("Must first setID(i)."); 
    } 
    isLocked = true; 
} 
public void setID(int id) { 
    if(isLocked()) { 
     throw new IllegalStateException("isLocked() is true."); 
    } 
    this.id = id; 
} 

분명히 c 필드의 필드를 설정하면됩니다. onstructor는 훨씬 덜 복잡합니다.

+0

@MichalB :이 답변이 도움이되었다고 생각한다면 최대한 투표를하고 수락하십시오. 감사! – aliteralmind

관련 문제