Delphi的Java枚举方法

Delphi的Java枚举方法,java,delphi,Java,Delphi,我正在尝试将此枚举转换为Delphi。我知道如何定义枚举变量,但我不知道如何在枚举中插入方法 或者有人能提出另一种转换方法吗?您可以使用记录助手(record helper)实现部分转换,该助手可用于XE3以后的值类型。例如: public enum HTTPHeaderKey { CACHE_CONTROL("Cache-Control"), CONNECTION("Connection"), TRANSFER_ENCODING("Transfer-Encoding"), HOST("

我正在尝试将此枚举转换为Delphi。我知道如何定义枚举变量,但我不知道如何在枚举中插入方法


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

您可以使用记录助手(record helper)实现部分转换,该助手可用于XE3以后的值类型。例如:

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;
    }
};
该程序输出以下内容:

{$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.
这里的输出是:

{$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.
友好名称1 友好名称2 这可能允许您解决Delphi枚举类型不支持Java中可用的文本命名这一事实

枚举类型不支持另一种方法,构造函数
HTTPHeaderKey
。原因是它需要状态,Delphi枚举类型的唯一状态是枚举类型值本身。不能像在Java代码中那样移植额外的实例变量


综合考虑,我认为尝试使用枚举类型进行直译是行不通的。我建议您使用记录或类进行翻译,并使用可用的Delphi语言构造构建等效功能。

基于Davids answer,此修改版本应能够打印HTTP头名称:

Friendly name 1 Friendly name 2 应该输出

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.

哇!不知道您可以在枚举上使用记录帮助程序+1@markus_ja20分钟前我还不知道either@David“20分钟前,我还不知道,”我从SO中得到的一个主要好处是问题激发我尝试不同的东西,并通过实验学习。通常,这个问题只是提供了一个不同的角度来看待某件事情,它足以引发新的想法。这让我想起了我不久前写的一节课。我想为枚举中的每个值存储一个值。我希望能够加载并保存到字符串中
另一种方法是,枚举类型不支持构造函数HTTPHeaderKey
:友好名称数组可用于存储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