我目前正在试图弄清楚如何使用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());
}
即。 {
期待int test2
和Syntax error on token "lattice", VariableDeclaratorId expected after this token
。
正如我所说,Java已经有一段时间了,但是IIRC,这些括号不应该被要求。 This question确定此括号用法是初始化块,但这可能不是我想要做的。
有谁知道为什么Eclipse要求我设置这些括号,或者我可以做些什么来改变这种行为?
提前致谢! 马丁
PS:一些可能有用的信息:
我使用eclipse-indigo,安装了建模工具包AMP。我不完全确定如何检查这个,但我相信我正在使用jre6,因为这是我在包浏览器的JRE系统库选项卡中所说的。将来,我计划找到一种使用Groovy运行Escape建模环境的方法,但那将是另一个问题......
答案 0 :(得分:5)
这与您的IDE无关。 Java不允许在类级别使用语句,但它允许在类级别使用初始化程序。
{foo();}
这是一个实例初始化程序,它将被编译器复制到所有构造函数中 (见Java Tutorial > Initializing Fields)
在Java中,您可以在
中编写语句但没有其他地方。
答案 1 :(得分:3)
如果将字段初始化与声明分开,则需要方法或初始值设定项。此实例无需初始值设定项即可运行:
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。例如,JMock使用这种语法来提供一个易于grock lambda的构造:
context.checking(new Expectations() {{
oneOf (subscriber).receive(message);
}});
答案 2 :(得分:1)
public class CoordinationGame extends Scape {
// ...
int test2;
// ...
test2 = 3; // <- errror
}
这是非法的,我们不能在类体中以这种方式赋值。其他代码是合法的,因为您使用静态初始化程序来初始化字段test2
。
错误消息非常具有误导性,但老实说,这种情况在Java中经常发生;)
答案 3 :(得分:0)
如果您要初始化test
和test2
变量,则应在声明时进行初始化。
boolean test = true;
int test2 = 3;
您添加的{
和}
会创建一个初始化程序块,以避免错误。这是一种奇怪的做事方式,所以如果可能的话,我总是更愿意看到在声明点初始化的变量!
答案 4 :(得分:0)
如果要初始化字段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;
}