2012-08-27 7 views
15

Java 8インターフェースのパブリック・メンバー変数は、フィーチャーかインプリメンテーションの副作用/欠陥ですか?Java 8(プレリリース版)のインターフェース・メンバー変数

この質問は、プレリリースJava 8ビルドlambda-8-b50-linux-x64-26_jul_2012.tar.gzに関連しています。

Java 8は、デフォルトメソッドの形式で新しい機能をインターフェイスに導入しています。

public interface Foo { 
    public int foo = 0; 
    int foo() default { return foo; } 
} 

サンプル実装タイプ:

Foo f = new FooImpl(); 
System.out.println(f.foo()); 
System.out.println(f.foo); 
System.out.println(new FooImpl().foo); 

出力:このコードは、変数シャドウイングのための標準的な規則に従う

public class FooImpl implements Foo { 
    public int foo = 1; 
} 

JDK8ラムダコンパイラでカジュアル試験は、この形式のインターフェースを可能にします。

0 
0 
1 

ドキュメント(JSR 335:Java™プログラミング言語バージョン0.5.1のラムダ式)には、メンバ変数は記載されていません。私はコンパイラがあまりにも寛容だと思う傾向があるが、おそらく私は何かを逃した。

答えて

27

インタフェースのパブリックフィールドは、Java 8の新機能ではありません。暗黙のうちに静的で最終的なものであることを覚えていれば、あなたが見ている結果は完璧です。

+2

'Foo.foo = 0;'を試してください – oldrinb

+4

+1 - そして、Java 8は、パブリックインターフェイスフィールドを非静的であるか、または非最終的なものに変更できないことを追加できます。さまざまな方法。 –

+2

Doh!あなたは正しいです - 私はちょうど最後の静的な最終15年間宣言しています。ここにJLSの関連セクションがあります:[9.3。フィールド(定数)宣言](http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.3)を参照してください。 – McDowell

関連する問題