Подражание Java перечислениям с помощью Javascript? - PullRequest
2 голосов
/ 14 июля 2020

У нас есть приложение javascript, которое подключается к услуге java. В нашем внешнем приложении мы пытаемся выровнять все константы с объявлениями на стороне сервиса (перечисления в этом формате: UPPER_SNAKE_CASE), но часто нам нужно отформатировать константы в других случаях (начальный регистр, camelCase и т. Д. c

Чтобы сделать использование констант и их объявления более последовательными, в настоящее время у нас есть настройка, которая выглядит примерно так

// Class definition
export default class BaseEnum {
  constructor (obj) {
    const { varName } = obj;

    this.snakeCase = obj.snakeCase  Case ? obj.snakeCase : lodash.snakeCase(obj.varName);
    this.camelCase = obj.camelCase ? obj.camelCase : lodash.camelCase(obj.varName);
    this.text = obj.text ? obj.text : lodash.startCase(lodash.lowerCase(obj.varName));
    this.upperSnakeCase = obj.upperSnakeCase ? obj.upperSnakeCase : lodash.upperCase(obj.varName).replace(/ /g, '_');
    // ... other formats etc
  }
}

// Declaring a enum class
export const SUNNY_DAY = new BaseEnum({ 
  varName: 'SUNNY_DAY',
  camelCase: 'sunnyDay', // if for some reason we want to override the camelCase, we do it here; camelCase: 'sunny'
  text: 'Today is a sunny day',
  upperSnakeCase: undefined // if left out, the class will generate the upperSnakeCase format
});


// In use
console.log(SUNNY_DAY.snakeCase);
console.log(SUNNY_DAY.camelCase);     // ... etc

Однако большую часть времени мы обращаемся к Формат UPPER_SNAKE_CASE, так что в итоге мы получаем его разбросанный повсюду

console.log(SUNNY_DAY.upperSnakeCase);

Есть ли способ сопоставить c внутреннюю Java toString magi c в Javascript?

public enum SunnyDay {
  SNAKE_CASE('SUNNY_DAY'),
  CAMEL_CASE('sunnyDay'),
  TEXT('Today is a sunny day')

  private String description;

  public SunnyDay(String description) { this.description = description; }

  public String description() { return this.description; }

  // other overrides
}

Вопрос: есть ли способ использовать его описанным ниже способом, похожим на Java?

console.log(SUNNY_DAY); // default prints 'SUNNY_DAY', instead of the object
sout(SunnyDay.SNAKE_CASE); // 'SUNNY_DAY'

Я попытался переопределить прототип toString , но для этого также требуется вызов SUNNY_DAY.toString (), который выглядит примерно так же, как вызов SUNNY_DAY.upperSnakeCase. Я не могу придумать, как использовать Javascript для того, что Java делает за сценой с его версией toString ();

Я также пытался создать какой-то абстрактный класс для расширения, но безрезультатно.

Есть идеи? Возможно ли это вообще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...