为什么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 test2
和Syntax 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中经常发生;)
如果要初始化test
和test2
变量,则应在声明时进行初始化。
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; }