为什么Eclipse要求我在java代码中设置(任意)括号?

我目前正在试图弄清楚如何使用Eclipse在java中编写Escape模型。 我是Escape和Eclipse的新手,自从我用java编程以来已经有一段时间了,所以请原谅这是一个愚蠢的问题。

基本上,我一直被奇怪的Eclipse错误消息所困扰。 我跟踪了最后一个问题:

这有效:

public class CoordinationGame extends Scape { . . . Scape lattice; boolean test; int test2; { test = true; test2 = 3; } { lattice = new Scape(new Array2DVonNeumann()); } } 

这给出了奇怪的错误消息:

 public class CoordinationGame extends Scape { . . . Scape lattice; boolean test; int test2; test = true; test2 = 3; lattice = new Scape(new Array2DVonNeumann()); } 

ie {期望afer int test2Syntax error on token "lattice", VariableDeclaratorId expected after this token

正如我所说,Java已经有一段时间了,但是IIRC,这些括号不应该被要求。 这个问题确定这个括号用法是一个初始化块,但这可能不是我想要做的。

有谁知道为什么Eclipse要求我设置这些括号,或者我可以做些什么来改变这种行为?

提前致谢! 马丁

PS:一些可能有用的信息:

我使用eclipse-indigo,安装了建模工具包AMP。 我不完全确定如何检查这个,但我相信我使用的是jre6,因为这就是它在我的包浏览器的JRE系统库选项卡中所说的内容。 将来,我计划找到一种使用Groovy运行Escape建模环境的方法,但这将是另一个问题……

这与您的IDE无关。 Java不允许在类级别使用语句,但它允许在类级别使用初始化程序。

 {foo();} 

这是一个实例初始化程序,它将被编译器复制到所有构造函数中。
(请参阅Java教程>初始化字段 )

在Java中,您可以编写语句

  • 一个方法
  • 构造函数(这是一种特殊的方法)
  • 初始化块(静态或实例)

但没有其他地方。

如果将字段初始化与声明分开,则需要方法或初始化程序。 此实例无需初始值设定项:

 package ede.brook.model; import org.ascape.model.Scape; public class CoordinationGame extends Scape { public int latticeHeight = 30; public int latticeWitdh = 30; public int nPlayers = 200; Scape lattice = new Scape(new Array2DVonNeumann());; Scape players; boolean test = true; int test2 = 3; test = true; test2 = 3; } 

如果存在初始值设定项,则它们在构造函数之前执行。

至于编码实践,我建议不要使用初始化器,并对简单情况使用组合声明+初始化,或者对于更复杂的结构使用(无参数)构造函数。 静态初始值设定项是一个例外,它可能是更复杂的初始化所必需的:

 static SomeTypeWithComplexInitialization staticField; static { SomeOtherType factoryParameter = new SomeOtherType() staticField = SomeTypeFactory.createInstance(factoryParameter); } 

我建议使用初始化程序的唯一其他实例是特别推荐此API的API。 例如,JMock使用这种语法来提供一个易于grock lambda的构造:

 context.checking(new Expectations() {{ oneOf (subscriber).receive(message); }}); 
 public class CoordinationGame extends Scape { // ... int test2; // ... test2 = 3; // <- errror } 

这是非法的,我们不能在类体中以这种方式赋值。 其他代码是合法的,因为您使用静态初始化程序来初始化字段test2

错误消息非常具有误导性,但老实说,这种情况在Java中经常发生;)

如果要初始化testtest2变量,则应在声明时进行初始化。

 boolean test = true; int test2 = 3; 

您添加的{}创建了一个初始化块,可以避免错误。 这是一种奇怪的做事方式,所以如果可能的话,我总是更愿意看到在声明点初始化的变量!

如果要初始化字段lattice,test和test2,请尝试使用以下命令:

  package ede.brook.model; import org.ascape.model.Scape; public class CoordinationGame extends Scape { private static final long serialVersionUID = 1L; public int latticeHeight = 30; public int latticeWitdh = 30; public int nPlayers = 200; Scape lattice = new Scape(new Array2DVonNeumann()); Scape players; boolean test = true; int test2 = 3; }