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