Java 枚举方法 Delphi
Java enum method to Delphi
public enum HTTPHeaderKey {
CACHE_CONTROL("Cache-Control"), CONNECTION("Connection"), TRANSFER_ENCODING("Transfer-Encoding"), HOST("Host"), USER_AGENT("User-Agent"), CONTENT_LENGTH("Content-Length"), CONTENT_TYPE("Content-Type");
private final String str;
private HTTPHeaderKey(final String _str) {
str = _str;
}
/** Over ridden toString returns the HTTP/1.1 compatible header */
public String toString() {
return str;
}
};
我正在尝试将此枚举转换为 Delphi。我知道如何定义枚举变量,但我不知道如何在枚举中插入方法?
或者有人可以建议另一种转换方法吗?
您可以使用记录帮助程序来实现这一点,它可用于 XE3 及更高版本的值类型。例如:
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.TypInfo;
type
TMyEnum = (enumValue1, enumValue2);
TMyEnumHelper = record helper for TMyEnum
public
function ToString: string;
end;
function TMyEnumHelper.ToString: string;
begin
Result := GetEnumName(TypeInfo(TMyEnum), ord(Self));
end;
begin
Writeln(enumValue1.ToString);
Writeln(enumValue2.ToString);
end.
这个程序输出如下:
enumValue1
enumValue2
当然你可能更喜欢这样:
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.TypInfo;
type
TMyEnum = (enumValue1, enumValue2);
TMyEnumHelper = record helper for TMyEnum
private
const
EnumNames: array [TMyEnum] of string = ('Friendly name 1', 'Friendly name 2');
public
function ToString: string;
end;
function TMyEnumHelper.ToString: string;
begin
Result := EnumNames[Self];
end;
begin
Writeln(enumValue1.ToString);
Writeln(enumValue2.ToString);
end.
这里的输出是:
Friendly name 1
Friendly name 2
这可能会让您解决 Delphi 枚举类型不支持 Java.
中可用的文本命名这一事实
另一种方法,构造函数HTTPHeaderKey
不支持枚举类型。原因是它需要状态,而 Delphi 枚举类型的唯一状态是枚举类型值本身。您不能像在 Java 代码中那样嫁接额外的实例变量。
考虑到所有因素,我认为尝试使用枚举类型进行直译是行不通的。我建议您使用记录或 class 进行翻译,并使用可用的 Delphi 语言结构构建等效功能。
根据 David 的回答,这个修改后的版本应该能够打印 HTTP header 名称:
type
THTTPHeaderKey = (hkCACHE_CONTROL, hkCONNECTION, hkTRANSFER_ENCODING);
TTHTTPHeaderKeyHelper = record helper for THTTPHeaderKey
private
const
EnumNames: array [THTTPHeaderKey] of string = ('Cache-Control', 'Connection', 'Transfer-Encoding');
public
function ToString: string;
end;
// ToString returns the HTTP/1.1 compatible header
function TTHTTPHeaderKeyHelper.ToString: string;
begin
Result := EnumNames[Self];
end;
...
begin
Writeln(hkCACHE_CONTROL.ToString);
Writeln(hkTRANSFER_ENCODING.ToString);
end.
应该输出
Cache-Control
Transfer-Encoding
public enum HTTPHeaderKey {
CACHE_CONTROL("Cache-Control"), CONNECTION("Connection"), TRANSFER_ENCODING("Transfer-Encoding"), HOST("Host"), USER_AGENT("User-Agent"), CONTENT_LENGTH("Content-Length"), CONTENT_TYPE("Content-Type");
private final String str;
private HTTPHeaderKey(final String _str) {
str = _str;
}
/** Over ridden toString returns the HTTP/1.1 compatible header */
public String toString() {
return str;
}
};
我正在尝试将此枚举转换为 Delphi。我知道如何定义枚举变量,但我不知道如何在枚举中插入方法?
或者有人可以建议另一种转换方法吗?
您可以使用记录帮助程序来实现这一点,它可用于 XE3 及更高版本的值类型。例如:
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.TypInfo;
type
TMyEnum = (enumValue1, enumValue2);
TMyEnumHelper = record helper for TMyEnum
public
function ToString: string;
end;
function TMyEnumHelper.ToString: string;
begin
Result := GetEnumName(TypeInfo(TMyEnum), ord(Self));
end;
begin
Writeln(enumValue1.ToString);
Writeln(enumValue2.ToString);
end.
这个程序输出如下:
enumValue1 enumValue2
当然你可能更喜欢这样:
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.TypInfo;
type
TMyEnum = (enumValue1, enumValue2);
TMyEnumHelper = record helper for TMyEnum
private
const
EnumNames: array [TMyEnum] of string = ('Friendly name 1', 'Friendly name 2');
public
function ToString: string;
end;
function TMyEnumHelper.ToString: string;
begin
Result := EnumNames[Self];
end;
begin
Writeln(enumValue1.ToString);
Writeln(enumValue2.ToString);
end.
这里的输出是:
Friendly name 1 Friendly name 2
这可能会让您解决 Delphi 枚举类型不支持 Java.
中可用的文本命名这一事实另一种方法,构造函数HTTPHeaderKey
不支持枚举类型。原因是它需要状态,而 Delphi 枚举类型的唯一状态是枚举类型值本身。您不能像在 Java 代码中那样嫁接额外的实例变量。
考虑到所有因素,我认为尝试使用枚举类型进行直译是行不通的。我建议您使用记录或 class 进行翻译,并使用可用的 Delphi 语言结构构建等效功能。
根据 David 的回答,这个修改后的版本应该能够打印 HTTP header 名称:
type
THTTPHeaderKey = (hkCACHE_CONTROL, hkCONNECTION, hkTRANSFER_ENCODING);
TTHTTPHeaderKeyHelper = record helper for THTTPHeaderKey
private
const
EnumNames: array [THTTPHeaderKey] of string = ('Cache-Control', 'Connection', 'Transfer-Encoding');
public
function ToString: string;
end;
// ToString returns the HTTP/1.1 compatible header
function TTHTTPHeaderKeyHelper.ToString: string;
begin
Result := EnumNames[Self];
end;
...
begin
Writeln(hkCACHE_CONTROL.ToString);
Writeln(hkTRANSFER_ENCODING.ToString);
end.
应该输出
Cache-Control
Transfer-Encoding