Vala 没有直接等效于 Java 的 final 关键字。我认为你能来的最接近的是这样的:
public class Rectangle : GLib.Object {
public double sideA { get; construct; }
public double sideB { get; construct; }
public double area { get; construct; }
public double diagonal { get; construct; }
public Rectangle (double SideA, double SideB) {
GLib.Object (
sideA: SideA,
sideB: SideB,
area: SideA * SideB,
diagonal: Math.sqrt(Math.pow(SideA, 2) + Math.pow(SideB, 2)));
}
}
构造属性与 final 有点不同,主要是因为 GObject 构造的工作方式。它们只能在构造时设置,但与 Java 中的 final 不同(IIRC ......我的大部分 Java 知识已被压制)它们也可以在构造期间由子类设置。例如,这是完全可以接受的:
public class Square : Rectangle {
public Square (double Side) {
GLib.Object (
sideA: Side,
sideB: Side,
area: Side * Side,
diagonal: Math.sqrt(Math.pow(Side, 2) + Math.pow(Side, 2)));
}
}
所以,如果你想允许 GObject 风格的构造(如果你正在制作一个其他人会调用的库,我建议你这样做......如果代码只是为你准备的,则不需要),你可能想做一些事情更像这样:
public class Rectangle : GLib.Object {
public double sideA { get; construct; }
public double sideB { get; construct; }
private double? _area = null;
public double area {
get {
if ( _area == null )
_area = sideA * sideB;
return _area;
}
}
private double? _diagonal = null;
public double diagonal {
get {
if ( _diagonal == null )
_diagonal = Math.sqrt(Math.pow(sideA, 2) + Math.pow(sideB, 2));
return _diagonal;
}
}
public Rectangle (double SideA, double SideB) {
GLib.Object (
sideA: SideA,
sideB: SideB,
area: SideA * SideB,
diagonal: Math.sqrt(Math.pow(SideA, 2) + Math.pow(SideB, 2)));
}
}