Delphi中的Java最终变量

时间:2015-02-04 09:47:32

标签: delphi

我很好奇,delphi中最终标签的等价物是什么:

 public final int stackoverflow;

我用

  

class var

标签,但类var等于静态变量。但最终与他们不同。

3 个答案:

答案 0 :(得分:5)

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

因此在Delphi中没有相同的东西。没有任何东西允许您将变量限制为初始化不超过一次。最接近的等价物是一个常数,用const声明。这会限制您在const声明中进行初始化。

答案 1 :(得分:1)

与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.

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

这是一个带有决赛的课程 - 但它只是最后的评论,如果你尊重这个

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

或使用记录

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

答案 2 :(得分:0)

您可以在Delphi中使用const关键字

 Const MAX_LINES = 3;

请注意,在运行应用程序期间,您永远无法更改值