2015-08-25 5 views
2

Я ищу исходный код Apache Шторма и я столкнулся то, что я никогда не видел: CLOSE_MESSAGE ((короткий) -100) или CLOSE_MESSAGE ((короткий) -100) , Почему нужно вычесть someNumber из короткого типа? Что это значит? Здесь пока фактический код:Java, Enum: (короткий) - someNumber

enum ControlMessage { 
    CLOSE_MESSAGE((short)-100), 
    EOB_MESSAGE((short)-201), 
    OK_RESPONSE((short)-200), 
    FAILURE_RESPONSE((short)-400), 
    SASL_TOKEN_MESSAGE_REQUEST((short)-202), 
    SASL_COMPLETE_REQUEST((short)-203); 

private short code; 

//private constructor 
private ControlMessage(short code) { 
    this.code = code; 
} 

/** 
* Return a control message per an encoded status code 
* @param encoded 
* @return 
*/ 
static ControlMessage mkMessage(short encoded) { 
    for(ControlMessage cm: ControlMessage.values()) { 
     if(encoded == cm.code) return cm; 
    } 
    return null; 
} 

int encodeLength() { 
    return 2; //short 
} 

/** 
* encode the current Control Message into a channel buffer 
* @throws Exception 
*/ 
ChannelBuffer buffer() throws IOException { 
    ChannelBufferOutputStream bout = new ChannelBufferOutputStream(ChannelBuffers.directBuffer(encodeLength()));  
    write(bout); 
    bout.close(); 
    return bout.buffer(); 
} 

void write(ChannelBufferOutputStream bout) throws IOException { 
    bout.writeShort(code);   
} 
} 

ответ

2

Нет, я не думаю, что это вычитает число. Это литье a int до short! В enum есть конструктор, который принимает аргумент short, поэтому он просто означает передачу отрицательных целых чисел в конструктор!

1

С учетом этого код (short)-someNumber просто линяет int на короткий. И это нужно сделать, потому что конструктор Enum принимает короткий не int в этом случае.

EDIT: Я просто понял, что минус может быть немного вводит в заблуждение, так, еще один способ, чтобы написать ту же строку кода будет выглядеть так:

int someNumber = -100; 
    int someNumber1 = -201; 
    enum ControlMessage { 
     CLOSE_MESSAGE((short)(someNumber)), 
     EOB_MESSAGE((short)(someNumber1)), 
     (...) 
    } 

где переменная someNumber имеет тип int и может быть любым числом, в данном случае это -100, -201, -200 и т. д.

+0

после просмотра всех ответов, я думаю, что это кастинг использовался для обозначения FLAGS, как в HTTP-заголовке 200, означает «ОК», но я не понимаю, почему они использовали отрицательные числа? – Humoyun

+0

Честно говоря, я не знаком с Apache, хотя это может быть соглашение для этих конкретных сообщений, чтобы использовать конкретные отрицательные числа, чтобы при появлении в журналах ошибок их можно было легко идентифицировать как ошибка 404 (не найдена)). Очевидно, что из области перечисления нет проблем с использованием отрицательных чисел. Что касается кастинга на короткий, может быть просто для оптимизации использования памяти, так как для краткости требуется меньше битов, чем int, чтобы таким образом уменьшить выделенную память. Я действительно использую short вместо int для этих случаев. Иногда даже байт. – Mechanic

1

Как упоминалось в других ответах, то, что происходит в коде, называется литье. Вот некоторые ресурсы, где вы можете узнать больше.

  • Для ознакомления ознакомьтесь с инструкцией по Java на Inheritance. Он имеет участок около дна на Объекты литья.
  • Техническое объяснение см. В Спецификации языка Java по адресу Casting Conversion.
  • Для аналогичной темы SO см. Setting Short Value Java.