Использование перечисления вместо регистра в Gosu - PullRequest
0 голосов
/ 10 мая 2018

Я хочу избежать создания регистра переключателя и вместо этого использовать enum, но при написании следующего кода я получаю сообщение об ошибке компиляции: unexpected token public:

public enum Status {
  INACTIVE {
    public void doSomething() {
      //do something
    }
  },
  ACTIVE {
    public void doSomething() {
      //do something else
    }
  },
  UNKNOWN {
    public void doSomething() {
      //do something totally different
    }
  };

  public abstract void doSomething()
}

По сути, я хочу достичь чего-то подобного:

public enum Status {
   ACTIVE,
   INACTIVE,
   UNKNOWN;
}

switch (getState()) {
  case INACTIVE:
    //do something
    break;
  case ACTIVE:
    //do something else
    break;
  case UNKNOWN:
    //do something totally different
    break;
}

Разрешено ли это в Госу? Как мне добиться такого поведения?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Как вы можете прочитать в грамматика Госу или ниже function не допускается внутри констант enum, даже скобки {} после констант не допускаются.

Что разрешено в enumbody:

enumBody = "{" [enumConstants] classMembers "}" .
enumConstants = enumConstant {"," enumConstant} [","] [";"] .
enumConstant = {annotation} id optionalArguments .

Так что в основном в GOSU перечисление содержит константы и остальные как обычно в любом другом классе.

0 голосов
/ 16 мая 2018

Вы неправильно поняли концепцию Enum.Прежде всего, enum наследуется от java.lang.Enum.Нельзя реализовывать внутренние классы до Enum constants.Вы должны рассматривать ACTIVE, INACTIVE и UNKNOWN (Enum constants) как objects из class type Status.Доказательство:Status.ACTIVE.getClass() == class StatusStatus.ACTIVE instanceof Status == trueStatus.ACTIVE instanceof java.lang.Enum == trueЕсли вы хотите избежать оператора switch в своем основном коде, вы можете переместить switch в реализацию enum следующим образом;(закодировано в Госу)

enum Status {
  ACTIVE,INACTIVE,UNKNOWN;

  public function doSomething(){
    switch (this) {
      case INACTIVE:
         //do something
         break;
      case ACTIVE:
        //do something
        break;
      case UNKNOWN:
        //do something
        break;
    }
  }
}

Теперь у вас есть возможность вызывать метод doSomething() из enum constants в вашем основном кодеПример:

var a=Status.ACTIVE
var b=Status.INACTIVE
var c=Status.UNKNOWN
a.doSomething()
b.doSomething()
c.doSomething()
...