2010-12-14 5 views
8

클래스 Product와 인터페이스 LargeProduct가 있습니다. 제품은 LargeProduct를 구현합니다.최종 필드를 할당 할 수 없습니다. 인터페이스의 경우

LargeProduct에는 getter 및 setter 메서드가있는 가변 높이가 있으며 Product 클래스에 구현해야합니다.

LargeProduct의 높이 변수과 같이 정의된다 :

public int getHeight() { 
    return height; 
} 

하지만 setter 메소드하지 않습니다 :

public int height = null; 

게터 방법은 잘 작동

public void setHeight(int height) { 
    this.height = height; 
} 

오류 :

The final field LargeProduct.height cannot be assigned 
The static field LargeProduct.height should be accessed in a static way 

실제로 제공되는 오류가 확실하지 않습니다. Eclipse를 사용하고 있습니다. 커서를 올려 놓으면 첫 번째 오류가 발생하고 창 하단에는 두 번째 오류가 발생합니다.

+2

인터페이스는 호출자와 수신자 간의 계약을 정의합니다. 메소드와 상수는 필드가 아닌 해당 계약의 일부입니다. (getter 또는 setter가 필요하지 않은 경우) 부모가 필드를 정의하도록하려면 추상 클래스를 사용합니다. –

답변

15

인터페이스로 제품의 높이를 선언합니다. 인터페이스는 이어야합니다.은 나머지 인터페이스와 진정으로 관련이있는 경우 상수를 포함해야하며 다른 상수 당 SHOUTY_CASE을 사용해야합니다. LargeProduct처럼 height이라는 상수가 없어야하지만 대신 구현시 height 필드를 선언해야합니다.

인터페이스는 유형의 기능을 보여주는 API임을 유의하십시오. 필드는 API의 일부가 아니어야합니다. 구현 세부 사항입니다. 결국, 간단한 변수를 기반으로 getHeightsetHeight을 쓸 것이라고 누가 말할 것입니까? 이러한 메소드는 데이터베이스를 조회하거나 다른 유형의 인스턴스에 위임 할 수 있습니다. 인터페이스의 소비자는 그 사실을 알거나 신경 쓰지 않아야합니다. 인터페이스의 필드에 대한 자세한 내용은

, 난 당신이 section 9.3 of the Java Language Specification을 읽으십시오 :

인터페이스의 몸에있는 모든 필드 선언은 암시 적으로, 공공 정적, 그리고 마지막이다. 이러한 필드에 대해 이러한 수정 자의 일부 또는 전부를 중복 지정하는 것이 허용됩니다.인터페이스의 기본 필드 (멤버 변수)으로

+2

무엇?! 그래서 특정 인터페이스에 특정 변수를 저장할 수 없습니까? – Matt

+0

@Matt : 아니요. 설명을 편집합니다. –

+0

@Jon final이 주요 문제입니다. http://stackoverflow.com/questions/4438228/the-final-field-cannot-be-assigned-for-an-interface/4438277#4438277 –

0

최종 필드에 값을 할당 할 수 없습니다. 단지 상수이 아닌 범용 변수를 포함 할 수 있습니다

private int height; 
+0

최종 선언되지 않았습니다. S – Matt

+2

@Matt : 인터페이스에서 선언 되었기 때문에 암시 적으로 최종적입니다. –

1

공공 정적 최종

하고 당신이 LargeProduct에서 최종

2

높이 변수에 대한 세터가없는 정의 좋아요 :

public int height = null; 

인터페이스에 정의 된 변수는 암시 적으로 staticfinal, 즉 상수입니다. 그것이 컴파일러가 불평하는 것입니다.

인터페이스에서 인스턴스 변수를 정의 할 수 없습니다. 그냥 그대로 두십시오. get 및 set 메서드를 사용하면 클래스를 의도 한대로 사용할 수 있습니다. 실제 변수는 구현 클래스 인 경우 구현 세부 사항입니다.

+0

이것은 핵심 변수 인 _implicitly_ final입니다. 이것은 나를 위해 문제를 해결했다. – boettger1

0

정확히 org.life.java! 정적 최종 변수는 수정할 수 없습니다! Java에서 상수를 결정하는 방법이기 때문입니다.

관련 문제