1

Java 列挙型に基づいたライブラリを移植していて、それらがネイティブにサポートされるまで独自の列挙型をコーディングする必要があります。

しかし、私は失敗します!

以下のコードでは、ChessColor.values() メソッドが null を返しますが、その理由がわかりません。

しかし、私はDartに慣れていません...

私が見逃した静的フィールドと初期化に何かがあるに違いありません...

列挙型基本クラス

part of chessmodel;

/**
 * Emulation of Java Enum class.
 */
abstract class Enum {    

  final int code;
  final String name;

  Enum(this.code, this.name);    

  toString() => name;    

}

簡単な使い方のお試し

part of chessmodel;

final ChessColor WHITE = ChessColor.WHITE;
final ChessColor BLACK = ChessColor.BLACK;

class ChessColor extends Enum {

  static List<ChessColor> _values;
  static Map<String, ChessColor> _valueByName;

  static ChessColor WHITE = new ChessColor._x(0, "WHITE");
  static ChessColor BLACK = new ChessColor._x(1, "BLACK");

  ChessColor._x(int code, String name) : super (code, name) {
    if (_values == null) {
      _values = new List<ChessColor>();
      _valueByName = new Map<String, ChessColor>();
    }
    _values.add(this);
    _valueByName[name] = this;
  }

  static List<ChessColor> values() {
    return _values;
  }

  static ChessColor valueOf(String name) {
    return _valueByName [name];
  }

    ChessColor opponent() {
        return this == WHITE ? BLACK : WHITE;
    }

    bool isWhite() {
        return this == WHITE;
    }

    bool isBlack() {
        return this == BLACK;
    }

}
4

2 に答える 2

0

Java から Dart への移植は進んでいますが、まだ static init に関連する問題があります。

私のJava列挙型はスマートです。つまり ChessSquare A2 はその隣人を知っています。ChessBoardDirection は、反対方向であることを認識しています。ChessColor は相手の色などを知っています。

そのような設計について議論することはできると思いますが、チェスのコードを書くことに関しては、クリーンで優れたコードにつながります。

現在の移植の試みでは、静的なinitializeModule()メソッドをそのようなクラスに追加することを余儀なくされていることに気付きましたが、それらは互いに依存しているため、非常に速く厄介になります。

Java では、これは、クラスがロードされたときに実行されることが保証されている静的コード ブロックを使用して簡単に実行できます。

ChessColor を使用した以下の最小限の例では、dart でどのように解決するのが最適ですか? つまり、_opponent はどのように開始されますか。

ジャワ

package chess.model;

public enum ChessColor {
  WHITE, BLACK;

  private ChessColor opponent;

  public ChessColor opponent() {
    return opponent;
  }

  public boolean isWhite() {
    return this == WHITE;
  }

  public boolean isBlack() {
    return this == BLACK;
  }

  static { // Initiate cross dependencies
    WHITE.opponent = BLACK;
    BLACK.opponent = WHITE;
  }
}

ダーツ

part of chessmodel;

final ChessColor WHITE = ChessColor.WHITE;
final ChessColor BLACK = ChessColor.BLACK;

class ChessColor extends Enum {

  static ChessColor WHITE = new ChessColor._x(0, "WHITE");
  static ChessColor BLACK = new ChessColor._x(1, "BLACK");

  static List<ChessColor> _values = [WHITE, BLACK];
  static Map<String, ChessColor> _valueByName = {"WHITE": WHITE, "BLACK": BLACK};

  ChessColor _opponent;

  ChessColor._x(int code, String name) : super (code, name);

  static List<ChessColor> values() {
    return _values;
  }

  static ChessColor valueOf(String name) {
    return _valueByName [name];
  }

  ChessColor get opponent => _opponent; 
  bool get isWhite => this == WHITE;
  bool isBlack => this == BLACK;

}
于 2013-05-01T06:46:17.913 に答える