Delphi中的Java最终变量

Delphi中的Java最终变量,delphi,Delphi,我很好奇,delphi中final tag的等价物是什么: public final int stackoverflow; 我用 类变量 标记,但类var等于静态变量。但是final与它们不同。您可以在Delphi中使用const关键字 Const MAX_LINES = 3; 请注意,在应用程序运行期间,您永远不能更改该值。Java最终变量只能初始化一次。可以通过初始化语句或赋值语句进行初始化 因此,Delphi中没有等效的。没有任何东西允许您将变量的初始化限制为不超过一次。最接近的等

我很好奇,delphi中final tag的等价物是什么:

 public final int stackoverflow;
我用

类变量


标记,但类var等于静态变量。但是final与它们不同。

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

 Const MAX_LINES = 3;

请注意,在应用程序运行期间,您永远不能更改该值。Java最终变量只能初始化一次。可以通过初始化语句或赋值语句进行初始化


因此,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.
还是记录在案

TFoo = class
public
  Stackoverflow : Final<Integer>;
end;
TFoo=class
公众的
堆栈溢出:最终;
结束;

Delphi只支持在编译时初始化的常量。因此,在Delphi中,
public final int-someNumber=42
将是
public const-someNumber:Integer=42
。在我看来,它就像一个单例。因此,要模拟Delphi中的最终行为,您需要构造一个singleton。@PieterB在Java中,对最终变量赋值进行编译时检查,这是singleton无法模拟的。请注意,您可以使用
{$J+}
{$WRITEABLECONST ON}具有可写常量
directive@whosrdaddy-仅适用于类型化常量,例如:
Const MAX_line:Integer=3
我正要发布一些基本相同的东西。对于引用类型,必须小心使用泛型实现。奇怪的是为什么要初始化
的字符串
。。。布尔值肯定更有意义吗?也可以将
Final
的字段
设置为严格私有
,以强制这些字段的关键性为严格私有,以使其不会中断。@J。。。布尔值在这里毫无意义。所有引用计数类型都使用默认值预初始化。所以我可以相信,
fisimulated:string
将始终为空,因为
string
是一种引用计数类型。布尔值可以有任何值,因为它没有被初始化。啊,当然。。。当然我没有思考。一旦唱片变得足够聪明,我就忘了它们不是课程。在控制台中使用全局变量(已初始化)进行测试,这让人倍感困惑。值得一提的是,虽然您可以这样做,但没有人会这样做。@DavidFeffernan在这种情况下,我将始终使用带有注释的公共只读属性。
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.
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;