2014-02-25 1 views
10

getter가 반환 한 참조를 통해 개인 변수의 값을 변경할 수 있으면 setter 메서드를 무시하지 않습니까? getter-setter 및 개인 변수의 목적을 무효화하지 않습니까?Getter-Setter 및 전용 변수

public class Test{ 

private Dimension cannotBeChanged; 

public Test(int height, int width) 
{ 
    if(height!=3) 
     cannotBeChanged.height = height; 
    if(width!=3) 
     cannotBeChanged.width = width; 
} 

public Dimension getDimension() 
{ 
    return cannotBeChanged; 
} 


public void setDimension(int height, int width) 
{ 
    if(height!=3) 
     cannotBeChanged.height = height; 
    if(width!=3) 
     cannotBeChanged.width = width;  
} 

public static void main(String [] args) 
{ 
    Test testOne = new Test(5,5); 
    Dimension testSecond = testOne.getDimension(); 
    testSecond.height = 3; //Changed height and width to unwanted values 
    testSecond.width= 3; 
} 
+0

잘 .. 당신은 실제 데이터를 변경하기 위해 다른 사람을 원하지 않는 경우, 당신은 방어 복사본을 사용해야합니다 .. 새로운 치수를 반환하십시오 (cannotBeChanged); (복사 생성자 ....) – TheLostMind

+2

내 질문에 그런 어리 석고/간단한 질문에 대해 너무 많은 상향 보를 줄 수 있었으면 좋겠다. –

답변

12

예. 그렇습니다. 나는 getter와 setters에서 다음과 같은 결론을 가지고있다. 클린 코드 book; 당신이 정말로 그것을 받아들이면 그것을 사용할 수 있습니다.

  1. 매우 악의있는 ​​: 공개 입력란.
  2. 어느 정도 악마 : 게터와 세터는 필요하지 않습니다.
  3. 좋은 : 그들은 정말을 요구하는 경우에만 게터와 세터는 - 단지 이 조작 될 상태의 저장소로 유형을 치료하기보다는 유형의 상태, 를 사용하는 일이 "큰"동작을 노출 을 다른 유형으로.
+0

나는 "악마"라는 단어가 싫다. 프로그래밍에서 악 ("C"의 코에서 날아갈 수있는 비강 악마 제외)은 없습니다.). 그러나 기본적으로 사용되는 경우 문제가 발생할 수 있습니다. – immibis

1

프로그래머는 외부 엔터티가 그의 프로그램의 보안 된 변수를 만지는 방법을 고안해야합니다.

  1. 개체의 보안 속성에 대한 설정 도구를 만들지 마십시오. 게터 만 제공 될 수 있습니다.
  2. 프로그램 진행 중에 변경 될 수있는 속성에 대해서만 작성기를 만듭니다.
  3. 일부 속성에 특정 제한 사항을 적용하려는 경우 설정 도구를 사용하십시오. 잘못된 값 확인, 사전 채우기, 논리적 분석 적용, 다른 종속 속성 채우기, 방어 복사 등
  4. 게터/설정자는 시스템의 소프트웨어 엔트로피 유지에 도움이됩니다. 소프트웨어에 대한 정보 entropy.
  5. Boilerplate 코드의 리드가 필요하지 않은 getters/setter를 만들지 마십시오.
  6. getters/setters는 향후 프로그램 확장을위한 기본 구현을 변경하는 데 도움이됩니다. 로깅 라이브러리 등등 업그레이드
1

정확한 방법은 실제로 치수의 필요한 부분에만 세터를 제공하는 것입니다. 이 같은 :

public int getDimensionX() 
{ 
    return cannotBeChanged.getX(); 
} 

public int getDimensionY() 
{ 
    return cannotBeChanged.getY(); 
} 
0

여기에서 간단한 Testcase. Dimension은 참조이기 때문에 실제로 높이를 변경할 수 있지만 새 Dimension을 설정할 수는 없습니다.

import java.awt.Dimension; 


public class TestProperty 
{ 
    private String testy; 
    private Dimension testDim = new Dimension(2,2); 

    TestProperty(String testy) 
    { 
     this.testy = testy; 
    } 

    public String getTesty() 
    { 
     return testy; 
    } 

    public void setTesty(String testy) 
    { 
     this.testy = testy; 
    } 

    public Dimension getTestDim() 
    { 
     return testDim; 
    } 

    public void setTestDim(Dimension testDim) 
    { 
     this.testDim = testDim; 
    } 
} 

내 주요() - 방법 :

import java.awt.Dimension; 

public class Test 
{ 

    public static void main(String[] ARGS) 
    { 
     TestProperty testy = new TestProperty("Testy"); 

     String myString = testy.getTesty(); 
     Dimension myDimension = testy.getTestDim(); 
     myDimension.height = 5; //Changes the height of the private Dimension 
     myDimension = new Dimension(5,3); //Does not set a new Instance of Dimension to my TestProperty. 

     myString = "Test"; 
     System.out.println(myString+"|"+testy.getTesty()); 
     System.out.println(myDimension.height+"|"+testy.getTestDim().height); 
    } 
} 

출력 :

Test|Testy 
3|5 
0

개인 변수가 선언 된 클래스에서만 액세스 할 수 있도록 의미한다. 개인 변수의 값을 반환하는 getter 메서드를 만들 때 주소를 가져 오지 않고 대신 반환 된 값의 값을 보유하는 임시 복사본을 만듭니다.setter 메서드는 private 변수에 값을 설정합니다.이 값은 다른 클래스의 값일 때 수행 할 수 없습니다.

기본적으로 getter-setter 메서드는 다른 클래스의 전용 변수에 액세스하거나 수정할 때 사용됩니다.

참고 : 수정중인 너비 및 높이 값은 Dimension 클래스의 변수이므로 공개되지 않습니다.

이 예를 살펴 :

public class Test { 

private double width, height; 

public Test(int height, int width) 
{ 
    setDimension(height, width); 
} 

public double getWidth() { return width; } 
public double getHeight() { return height; } 


public void setDimension(int height, int width) 
{ 
    if(height!=3) 
     this.height = height; 
    if(width!=3) 
     this.width = width; 
} 

public static void main(String [] args) 
{ 
    Test test = new Test(5,5); 
    double testW = test.getWidth(); 

    testW = 3; 

    System.out.println(testW); 
    System.out.println(test.getWidth()); 
} 
} 

결과 :

3.0 
5.0