2014-10-24 2 views
0

나는 자아로 Java를 배우려고 노력하고 있으며 여러분 모두가 제대로 알고있는 게임 인 Monopoly를 만들고 있습니다.getter 메서드를 사용하여 생성자에서 초기화 할 변수

나는 내 대답을 찾았지만 찾지 못했습니다. 그래서 여기 있습니다.

두 개의 변수 fieldnumberfieldname이있는 클래스 Field이 있습니다. 내 아이디어는 번호가있는 필드를 만드는 것이므로 프로그램은 플레이어가 어디에 있는지 알 수 있습니다 (현재는 관련 없음). fieldnamefieldnumber만 판독 프로그램 후 필드에 대한 필드 및 이름을 만들었다 (편집하지 수단) 될 것이다.

나는이 두 변수를 생성자로 초기화 할 수 있고 변수가 "getters"이되도록 변수를 만들 수 있으므로 나중에 변경할 수 없습니다.

(OBS : 클래스 Field, 내가 나중에 메인 클래스의 데이터를 사용해야 만 서브 클래스)

임 조금 혼란과 내가 사용하고있는 책을 읽으려고,하지만 운.

답변

1

프리미티브) 두 attribut로 만들려면 :

class Field{ 

private String fieldname; 
private int fieldnumber; 

public Field (String fieldname, int fieldnumber) 
{ 
    this.fieldname = fieldname; 
    this.fieldnumber= fieldnumber; 
} 

public String getFieldname(){ 
    return fieldname; 
} 
public int getFieldnumber(){ 
    return fieldnumber; 
} 
public String toString(){ 
    return fieldnumber+ " " +fieldname; 
} 
public boolean equals(Object obj){ 
    Field field = (Field) obj; 
    return (fieldnumber == field.fieldnumber && fieldname.equals(field.fieldname); 
} 
} 
+0

그러면 ex를 생성 할 수 있습니까? 40 fieldname과 같은 fieldname1, fieldname2 ..... fieldname40 루프의 기본 클래스에서? – user1098185

+1

물론. 많은 Field instaces를 만들고 ArrayList에 넣습니다. Riadh

+0

고마워요. 이것이 내가 필요한 것입니다. :-) – user1098185

2

필드를 final으로 선언하고 생성자에 할당 한 다음 세터를 쓰지 마십시오.

속성 수가 증가하면 builder pattern을 사용하여 많은 인수를 갖는 생성자가 발생하지 않도록 할 수 있습니다.

class Field { 
    private final int fieldNumber; 
    private final String fieldName; 

    public Field(final int fieldNumber, final String fieldName) { 
    // you may validate the values here and throw exception in case of non-valid values 

    this.fieldNumber = fieldNumber; 
    this.fieldName = fieldName; 
    } 

    public int getFieldNumber() { 
    return fieldNumber; 
    } 

    public String getFieldName() { 
    return fieldName; 
    } 
} 
+0

사이드 노트 : 설정자가 작성된 경우에도 컴파일되지 않습니다. 이는 결선자가 생성자로부터 만 작성 될 수 있기 때문입니다. – polomo12

+0

@ polomo12 전체 클래스에서 볼 수있는 최종 변수에 대해 true입니다. 그러나 최종 변수는 어디에서나 선언 할 수 있습니다. 심지어 방법에서. –

1
  • A "게터는"당신의 필드의 값을 반환하는 방법이다.
  • "setter"는 일반적으로 필드의 값을 설정하고 (아마도 유효성 검사 후) 하나의 인수를 취하는 방법입니다.
  • 좋은 캡슐화를 들어
  • , 인스턴스 필드는 일반적으로 만 컨텍스트 내에서 허용하는 최대 범위 내에서 액세스해야
  • (게터/때로는 세터, protected 또는 패키지 보호 필드 일반적으로 private 필드는 상속 또는 더 복잡한 설정이 필요한 경우) final 비 액세스 한정자로 표시된 필드는 필드 클래스의 인스턴스 내에서 범위 경우에만, 귀하의 경우에는

한 번 할당 할 수 있지만, 한 번에 할당되지 달라 않을 것이다, 당신이 그들에게 final를 표시 할 수 있으며, 생성자 또는 인스턴스 문 (setter 없음)에 할당하십시오.

그들이 인스턴스에 바인딩되지 않습니다, 오히려 클래스에, 당신은 상수 (static final을)를 표시 할 수 있습니다 바로 그들을 할당하는 경우 (당신은 안전하게 그들이 불변 경우 그들에게 public을 할 수 있습니다 - 즉, String의 또는 인스턴스를 만들 때를 초기화하고 그 값을 얻을 수있는 게터를 사용할 수 있습니다)에 액세스 할 수 없습니다 (개인이 나는 제안

1

게터는 방법을 의미 객체가 저장하는 값을 반환합니다.getter가되는 변수는 아무 의미도 없습니다. 게터는 일반적으로 private로 선언 된 변수를 가져 오는 데 사용됩니다. 즉, 클래스 외부에서 '보이지'않는 변수입니다. 예제를 참조하십시오 :

class Example { 

    private int value; 

    public Example(int valueToBeSet) { 
     this.value = valueToBeSet; 
    } 

} 

위의 예제에서 변수 값은 예제 클래스에서만 볼 수 있습니다. 다른 클래스는 해당 변수를 가져올 수 없습니다. 이것은 다른 클래스가 값을 변경할 수 없도록하려는 경우에 유용합니다. 그러나 객체에서 값을 가져 오려면 getter를 사용합니다.

class Example { 

    private int value; 

    public Example(int valueToBeSet) { 
     this.value = valueToBeSet; 
    } 

    public int getValue() { 
     return this.value; 
    } 

} 

여기서 getValue() 메서드는 getter입니다. 비공개이기 때문에 값을 변경할 수는 없지만 getValue() 메서드를 호출하고 메서드가 public이므로 값을 가져올 수 있습니다.

는 을 변경할 수의 값을 얻을 수, 변수의 값을 할당,하지만 할

다른 방법은, 최종 키워드를 사용하는 것입니다

class Example { 

    public final int value; 

    public Example(int valueToBeSet) { 
     this.value = valueToBeSet; 
    } 

} 

변수의 값에만 설정할 수 있습니다이 방법 한 번, 생성자에서 그리고 결코 다시는. 그러나 공개이므로 클래스 외부에서 가치를 얻을 수 있습니다. 이것은 종종 일을하는 좋은 방법이지만, 단점이 있습니다. 즉, 제가 설명했듯이 더 이상 값을 변경할 수없고 다른 값을 가진 객체를 얻으려면 새로운 객체를 모두 만들어야합니다. 이것은 "getter 변수"에 가장 가깝습니다.

관련 문제