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;
我很好奇,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;