2010-12-14 3 views
8

私はクラスProductとインターフェイスLargeProductを持っています。製品はLargeProductを実装します。最後のフィールドを割り当てることはできません。

LargeProductには、getterメソッドとsetterメソッドがあり、Productクラスに実装する必要がある可変高さがあります。

LargeProductにおける高さの変数はそうのように定義されています。

public int getHeight() { 
    return height; 
} 

しかし、setterメソッドはしていません::

public int height = null; 

getterメソッドが正常に動作します

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番目のエラーが表示されます。

+2

インターフェイスは、呼び出し元と呼び出し先の間の契約を定義します。メソッドと定数は、フィールドではなく、その契約の一部です。 (getterやsetterが必要ない場合は)親がフィールドを定義するようにするには、抽象クラスを使用します。 –

答えて

15

インタフェースとして製品に高さを宣言します。インタフェースがの場合には、残りのインタフェースと本当に関連している定数が含まれている必要があります。他の定数の場合はSHOUTY_CASEを使用してください。 LargeProductには、heightという定数を持たないようにしてください。代わりに、実装でheightフィールドを宣言する必要があります。

インターフェイスはAPIのためのものであり、タイプの機能を示しています。フィールドはAPIの一部であってはなりません。の実装の詳細です。結局のところ、誰が簡単な変数に基づいてgetHeightsetHeightと書いてくれるのでしょうか?これらのメソッドは、データベースを照会したり、他のタイプのインスタンスに委譲することができます。インターフェースの消費者はそれを知ってはいけません。インタフェース内のフィールドの詳細については

、私はあなたがsection 9.3 of the Java Language Specificationを読むことをお勧め:

インタフェースの本体内のすべてのフィールド宣言が暗黙のうちに、パブリック静的、最終です。このようなフィールドには、これらの修飾子のいずれかまたはすべてを重複して指定することができます。インタフェースのデフォルトフィールド(メンバ変数)によって

+2

何ですか?だから私は特定のインターフェイスの特定の変数を格納することはできません? – Matt

+0

@Matt:Nope。説明を編集します。 –

+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

のpublic static finalであり、あなたはLargeProductにおける高さの変数が定義され ある最終

2

用セッターを持っていませんように:

public int height = null; 

インタフェースで定義された変数は暗黙的にstaticfinalの定数です。それはコンパイラが不平を言うことです。

インターフェイスでインスタンス変数を定義することはできません。そのまま放置する - getメソッドとsetメソッドは、クラスを意図したとおりに使用できるようにします。実際の変数は、実装クラスの実装の詳細です。

+0

これは、最終的なインタフェース変数は_implicitly_ finalです。これは私の問題を解決しました。 – boettger1

0

まったくorg.life.java!そして、静的な最終変数を変更することはできません!それはJavaの定数を決定する方法なので。

関連する問題