문제

두 학기 전, 나는 교수가 말했다.

여러분 중 일부는 항상 모든 개인 인스턴스 변수에 대한 세터 및 게터 방법을 포함하라는 지시를 받았습니다. 나는 이것이 정보 숨기기를 중단하고 종종 불변량을 시행 할 수없는 시스템을 초래한다고 말합니다.

자, 그것은 나에게 옳게 들립니다. 그러나 이런 종류의 세터/getters를 Javabean을 만드는 데있어 핵심 부분을 포함시키지 않습니까? 그렇다면 왜? 그렇지 않다면, 내가 Javabeans에 대해 오해하는 것은 무엇입니까?

도움이 되었습니까?

해결책

Java Bean 클래스에서는 게터와 세터가 필요하지 않습니다. 필요한 것은 클래스가 공개되어야하며, 공개 인수 생성자가 없어야하며 직렬화 가능해야합니다. 그러나 Bean을 사용할 때 변수를 자동으로 발견하려면 표준 명명 규칙 (GetVarname, SetVarname ...)에 따라 Getters 및 Setter를 제공해야합니다.

어쨌든, 당신은 수업 밖에서 사업이 보이는 변수 만 외부 적으로 보이게 만들고 싶습니다.

다른 팁

읽고 싶을 수도 있습니다 Getter와 Setter 방법이 사악한 이유:

"그러나 Javabeans는 어떻습니까?" 그들은 어떻습니까? 당신은 확실히 getters와 setters없이 Javabeans를 만들 수 있습니다. 그만큼 BeanCustomizer, BeanInfo, 그리고 BeanDescriptor 수업은 모두 정확히이 목적을 위해 존재합니다. Javabean Spec Designers는 Getter/Setter 관용구를 사진에 던졌습니다. 왜냐하면 그들은 콩을 빨리 만들 수있는 쉬운 방법이라고 생각했기 때문입니다. 불행히도 아무도 그렇게하지 않았습니다.

액세서는 특정 속성을 태그하는 방법으로 만 만들어 UI 건설 프로그램 또는 이와 동등한 것으로 식별 할 수 있습니다. 이 방법을 직접 부르지 않아야합니다. 자동화 된 도구를 사용할 수 있습니다. 이 도구는 introspection apis를 사용합니다 Class 클래스 방법을 찾고 메소드 이름에서 특정 속성의 존재를 추정합니다. 실제로이 내성적 인 관용구는 해결되지 않았습니다. 코드가 너무 복잡하고 절차 적으로 만들어졌습니다. 데이터 추상화를 이해하지 못하는 프로그래머는 실제로 액세서를 호출하며 결과적으로 코드는 유지 관리가 덜합니다.

일반적으로 매우 간단합니다. 외부에서 눈에 띄는 변수에 대한 세터/게터를 노출 시키며 변수에 대한 세터/게터를 노출시키지 않습니다.

당신의 교수는 정확합니다. 모든 인스턴스 변수에 대해 맹목적으로 게터와 세터를 만들고 싶지는 않습니다. 당신은 그들이 필요한 곳에 그들을 만들고 싶습니다.

당신이있는 경우 BankAccount a balance 균형을 확인하고 설정하려면 인스턴스 변수, 게터 및 세터를 작성하는 것이 합리적입니다.

여기에도 구현을 캡슐화하는 형태로 정보 숨기기가 있습니다. getter "double getBalance()"단순히 기본 인스턴스 변수의 값을 반환 할 수 있습니다. double, 또는 그것은에서 파생 된 값을 반환 할 수 있습니다. BigDecimal 이것이 변수의 구현 선택이거나 원격 웹 서비스를 호출하여 결과를 반환 할 수 있습니다. 따라서 Getter/Setter는 여전히 구현이 다양하여 캡슐화를 위반하지 않습니다 (및 확장에 의해 Javabean도 마찬가지입니다).

Javabeans가 당신을 위해하는 일은 인터페이스를 정의하는 것입니다 (getXXX(), setXXX()) "속성"을 얻고 설정하기 위해 사용자가 일반적으로 검사하거나 변경하려는 클래스의 속성. 수업에 "재산"으로 간주되지 않는 정보가있는 경우,이를 노출시킬 필요가 없습니다. 예를 들어, 말씀 드리겠습니다 BankAccount 클래스에는 인스턴스 변수가 인스턴스 변수를 검증하는 데 사용됩니다. 클라이언트가 액세스하거나 수정할 필요가없는 경우이를 위해 getter 또는 setter를 만들 필요가 없습니다.

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