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