Delphi的Java枚举方法

时间:2015-02-09 10:00:03

标签: java 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。我知道如何定义枚举变量,但我不知道,我如何在枚举中插入一个方法?

或者有人可以提出另一种转换方法吗?

2 个答案:

答案 0 :(得分:8)

您可以通过记录帮助程序获得部分路径,该记录帮助程序可用于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代码中那样移植额外的实例变量。

考虑到所有事情,我不认为尝试使用枚举类型的字面翻译会有效。我建议您使用记录或类进行翻译,并使用可用的Delphi语言结构构建等效功能。

答案 1 :(得分:1)

根据Davids的回答,这个修改过的版本应该能够打印HTTP头名称:

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