Java Delphi 中的最终变量

Java final variable in Delphi

我很好奇,delphi 中的 final 标签相当于什么:

 public final int Whosebug;

我用

class var

tag 但 class var 等于静态变量。但是final跟他们不一样。

您可以在 Delphi

中使用 const 关键字
 Const MAX_LINES = 3;

请注意,您永远无法在申请期间更改该值 运行

一个Javafinal变量只能初始化一次。此初始化可以通过初始化语句或赋值语句进行。

因此 Delphi 中没有等价物。没有什么可以让你限制一个变量被初始化不超过一次。最接近的等价物是一个常量,用 const 声明。这将限制您在 const 声明中进行初始化。

delphi没有可比性。

但是你可以用记录来实现这个

unit FinalType;

interface

uses
  System.SysUtils;

type
  Final<T> = record
  private
    FIsInitialized: string;
    FValue: T;
  public
    class operator implicit( const a: T ): Final<T>;
    class operator implicit( const a: Final<T> ): T;
  end;

implementation

{ Final<T> }

class operator Final<T>.implicit( const a: T ): Final<T>;
begin
  if Result.FIsInitialized <> ''
  then
    raise Exception.Create( 'Fehlermeldung' );

  Result.FIsInitialized := '*';
  Result.FValue := a;
end;

class operator Final<T>.implicit( const a: Final<T> ): T;
begin
  if a.FIsInitialized = ''
  then
    Result := default ( T )
  else
    Result := a.FValue;
end;

end.

program FinalCheck;

uses
  FinalType;

var
  MyFinalValue : Final<Integer>;

procedure OutputValue( AValue : Integer );
begin
  WriteLn( 'Value: ', AValue );
end;

begin
  MyFinalValue := 10; // everything is ok
  OutputValue( MyFinalValue );
  MyFinalValue := 12; // <- Exception
  OutputValue( MyFinalValue );
end.

更新

有一种副作用你无法捕捉到:

program FinalCheck;

uses
  FinalType;

var
  MyFinalValue : Final<Integer>;

procedure SetFinalValue( AValue : Integer );
var
  LNewValue : Final<Integer>;
begin
  LNewValue := AValue;
  MyFinalValue := LNewValue;
end;

begin
  MyFinalValue := 10; // everything is ok
  SetFinalValue( 12 ); // no exception!!!
end.

在大多数情况下,我将其视为 class 的 public 只读字段。在 Delphi 中,您将使用 public readonly 属性 代替,但您必须注意,该值不会从 class 内部更改。最后的标志只是一个守卫,你不能从里面改变价值。

这是一个 class 最后的 - 但它只是最终的评论,如果你尊重这个

TFoo = class
private
  // Please do not change this value once it is set
  FWhosebug : Integer;
public
  property Whosebug : Integer read FWhosebug;
end;

或备案

TFoo = class
public
  Whosebug : Final<Integer>;
end;