2010-04-02 3 views
10

개인 인스턴스 변수는 공용 getters 및 setters 메서드를 통해 액세스한다는 것을 알고 있습니다. 내가 IDE의 도움으로 생성자를 생성 할 때Java - getters 및 setters 메소드를 통해 생성자에서 개인 인스턴스 변수에 액세스해야합니까?

는하지만, 그것은 그들의 setter 메소드를 통해 초기화 대신 직접 인스턴스 변수를 초기화한다.

Q1. 그래서 나는 그들의 setter 메소드를 통해 인스턴스 변수를 초기화하기 위해 생성자에 대한 IDE 생성 코드를 변경해야한다.

2. 그렇다면 IDE가 생성자 코드를 생성하지 않는 이유는 무엇입니까? 편집을 할

============================= ================ =======================

  • 내가 이클립스와 넷빈즈 IDE는

  • 그것은 일반적인 질문 사용합니다. 그러나 @Lords의 질문에 따르면 응답자는 생성자가 공개인지 보호인지 또는 비공개 또는 비공개인지에 따라 다릅니다. 따라

+0

생성자가 공개되었거나 비공개입니까? – Pops

+0

@Lord 제 질문을 편집했습니다 –

+0

그리고 제 대답을 편집했습니다. (실제로 연속으로 두 번 편집합니다.) – Pops

답변

12

당신이해야 결코 호출 생성자의 비 마지막 방법.클래스 생성자는 객체를 초기화하는 데 사용되며 객체는 생성자가 반환 할 때까지 일관성있는 상태가 아닙니다. 생성자가 나중에 하위 클래스에 의해 재정의되는 비 최종 메서드를 호출하면 재정의 된 메서드가 호출 될 때 개체가 완전히 초기화되지 않으므로 예기치 않은 결과가 발생할 수 있습니다.

class A { 
    private int x; 

    public A() { 
     setX(2); 
    } 

    public void setX(int x) { 
     this.x = x; 
    } 

    public int getX() { 
     return x; 
    } 
} 

class B extends A { 
    private int number = 10; 

    @Override   
    public void setX(int x) { 
     // set x to the value of number: 10 
     super.setX(number); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     B b = new B(); 
     // b.getX() should be 10, right? 
     System.out.println("B.getX() = " + b.getX()); 
    } 
} 

이 프로그램의 출력은 :

이 인위적인 예를 고려

B.getX() = 0 

이유 Bnumber 부재 따라서 호출 될 때 setX 초기화되지 않는다는 기본값은 0입니다.

This article보다 자세한 설명이 있습니다. Effective Java.

1

. 세터/게터가 단순히 회원에 액세스하는 경우 직접 액세스해야합니다. 그와 함께 코드가 있다면 setter를 사용하십시오.

+0

괜찮지 만 setters가 Encapsulation을 따르고 나중에 setter에 (필요한 경우) 몇 가지 코드를 쉽게 추가 할 수 있도록 직접 설정하는 경우에도 setter를 사용하는 것이 더 좋지 않습니까? –

+0

그럼, 더 이상 세터가 아닐 것입니다. 당신은 또한 객체 지향적 관점에서 볼 때 setter는 객체 지향적이지 않다는 것을 고려해야한다. – Searles

0

당신은 당신이 생성자 어느 세터와 initalise하는 방법으로 초기화 할 필드를 결정해야한다. (둘 다 가능하다) 나는 생성자를 가능한 한 많이 사용하는 것을 선호하며 종종 세터가 없다.

IDE에서 구성 가능/선택 가능해야합니다. IDE가 무엇인지 알지 못하면 왜 작동하는지 알 수 없습니다.

2

생성자는 초기화 용입니다. 생성자에서 직접 private 인스턴스 변수를 초기화하십시오. 메서드는 객체의 비헤이비어를 정의합니다. 동작은 인스턴스화/초기화 후에 발생합니다. setter 메소드로 인스턴스 변수의 상태를 조작하십시오. 이것은 고전적인 OOP 사고이며 IDE가 코드를 생성하는 이유입니다.

0

좋은 답변입니다. 단지 Eclipse (내가 자주 사용하는 Eclipse)를 추가하기를 원할 때 원하는대로 코드를 생성 할 수 있도록 수정할 수있는 템플릿이 있습니다. 코드를 사용자의 필요에 맞게 조정하는 데 도움이 될 수 있습니다.

추신. 오히려 세터와 게터를 사용합니다. 습관처럼 일관성있게 코드를 유지하면 코드 전체에 습관을 유지하면 다른 사람이 읽는 것이 더 쉬워 진 것 같습니다. 모든 initialization != setters

0

먼저 (적어도 항상)

하지만 IDE를 그냥 세터를 통해 발생해야 한 번 존경 자바 빈즈 디자인 패턴 가정 속성 변경과 함께 멋진 연주된다.

그래서 디자인의 문제입니다. 수업은 순수 값 오브젝트를 표현하는 경우, = 를 통해 초기화하는 그러나 수업의 경우 전혀 해를 끼치 지 누구의 특성 변화 단지 초기화 또는 할당 이상입니다 JavaBeanset* 전화와 이동되기의 가능성이 없습니다.

0

클래스의 전용 인스턴스 변수는 (나는) 모든 클래스 생성자 외부에서 선언되어야한다고 믿어야합니다. 질문의 일부를 두 부분으로 나눌 수 있다면 :

Q1) 클래스가 인스턴스화 될 때 로컬 변수와 달리 인스턴스 변수가 초기화되면 주어진 클래스 생성자 (?) 내에서 추가 작업을 수행해야하는 이유가 무엇입니까?

A1) 인스턴스 변수를 초기화 할 필요가 없지만 (private string someString; default는 null이며 적합합니다), 컴파일러에서 할당 한 기본값이 원하는 값이 아닐 수도 있습니다. 더 나쁜, 부정확 한 (컴파일러가 잡아야하는).

Q2) 위 부분을 가정 할 때 get의 중요성은 무엇입니까? 세트; 속성?

A2) 등가성, 속성이 클래스 내에서 (분명히) 사용할 수 있다는 점은 쉽고 더 우아하다는 점 외에도 간단한 할당으로 사용하거나 추가 코드를 포함 할 수 있습니다 마지막으로 데이터는 클래스 내에 자체 포함되므로 디버그하기가 더 쉽습니다.

이 모든 것이 언급 되었기 때문에 책이나 다른 사람이하는 것과는 다른 일을하는 완전히 타당한 이유가있을 수 있습니다. "규칙 (들)"에는 항상 동의가 있으며 이에 따라 코드를 작성해야합니다.

관련 문제