我有一些奇怪的行为,我很难向自己解释。称为“textureScale”的浮点字段变为零。
如果某些代码正在更改该值,则可以解释这一点。然而,我希望能够通过将其设置为“私有最终浮点”来导致构建失败,或者至少是运行时异常 - 那么无论更改该值都将失败。但如果我这样做,代码根本不会失败 - 它工作得很好!
任何人都可以帮助我理解这里可能发生的事情 - 为什么这个浮点数可能会变为零,除非我将其设置为最终值?这里有我不熟悉的 Java 主义吗?唯一的解释是其他地方的代码中有些模糊吗?
public class TexturedBox extends Box {
// This field becomes 0.0?
private float textureScale = 1.0f;
public TexturedBox(Vector3f center, float x, float y, float z) {
super(center, x, y, z);
}
@Override
protected void duUpdateGeometryTextures() {
FloatBuffer buf = BufferUtils.createFloatBuffer(24);
buf.clear();
// All the values in these puts are "zero" - since textureScale is now zero?
buf.put(textureScale * 2f * xExtent); buf.put(0);
buf.put(0); buf.put(0);
buf.put(0); buf.put(textureScale * 2f * yExtent);
buf.put(textureScale * 2f * xExtent); buf.put(textureScale * 2f * yExtent);
// ... and more puts just like that ...
buf.flip();
setBuffer(Type.TexCoord, 2, buf);
System.out.println(textureScale);
// ^ This outputs zero
// ... unless I set textureScale to final - then everything works?!
}
}
在方法中设置断点。它是从超级构造函数中调用的吗?如果是这样,则该字段此时尚未初始化,因为超级构造函数是在子类的字段初始化之前调用的。
如果将字段声明为final,编译器可能会用常量表达式替换字段访问,这将使其正常工作
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)