我很好奇,delphi中最终标签的等价物是什么:
public final int stackoverflow;
我用
class var
标签,但类var等于静态变量。但最终与他们不同。
答案 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;
请注意,在运行应用程序期间,您永远无法更改值