Как представить nullable интервал типа примитива в Java?

Предполагая, что ваша цель состоит в том, чтобы иметь возможность перезапустить сервер без переобучения, похоже, что ваш лучший вариант (до тех пор, пока в трусиках не будет реализовано травление) - это выбрать data, eq_string и любые параметры, рассчитанные по train_model. Затем при перезапуске сервера вы можете отменить выбор data и eq_string и снова вызвать dmats = patsy.dmatrices(eq_string,data). Это должно выполняться довольно быстро, так как на самом деле это не тренировка модели, а просто предварительная обработка данных. Затем вы также выберете параметры, рассчитанные по train_model (не показано в вопросе), и сервер должен быть готов делать прогнозы для новых входных данных.

Обратите внимание, что если вы разбиваете это на клиентские и серверные компоненты, сервер должен делать все, что обсуждалось выше, и клиент должен просто отправить ему input_data, определенный в вашем вопросе. (Клиенту никогда не нужно видеть dmats или design_info.)

32
задан yinyueyouge 12 June 2009 в 05:43
поделиться

8 ответов

Вам придется либо отказаться от примитивного типа, либо использовать произвольное значение int в качестве «недопустимого года».

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

27
ответ дан 27 November 2019 в 20:12
поделиться

Возможно, вы захотите использовать здесь класс Integer. Накладные расходы, связанные с объектом, скорее всего (хотя и не обязательно) тривиальны для общей скорости отклика и производительности ваших приложений.

32
ответ дан 27 November 2019 в 20:12
поделиться

Десятки тысяч экземпляров Integer - это не много. Лучше потратить несколько сотен килобайт, чем проводить оптимизацию раньше времени. Это небольшая цена за правильность.

Остерегайтесь использования контрольных значений, таких как null или 0 . По сути, это означает ложь, поскольку 0 - это не год, а null не является целым числом. Распространенный источник ошибок, особенно если вы в какой-то момент не единственный сопровождающий программное обеспечение.

Рассмотрите возможность использования типобезопасного нуля, такого как Option , иногда известного как Возможно . Популярный в таких языках, как Scala и Haskell, он похож на контейнер с одним или нулевым элементом. Ваше поле будет иметь тип Option , который объявляет необязательный характер вашего поля года системе типов и заставляет другой код работать с, возможно, отсутствующими годами.

Вот библиотека, которая включает тип Option.

Вот как вы бы вызывали свой код, если бы вы использовали it:

partyLikeIts.setDocumentYear(Option.some(1999));

Option<Integer> y = doc.getDocumentYear();
if (y.isSome())
   // This doc has a year
else
   // This doc has no year

for (Integer year: y) {
  // This code only executed if the document has a year.
}
15
ответ дан 27 November 2019 в 20:12
поделиться

Другой вариант - иметь связанный логический флаг, который указывает, действительно ли ваше значение года. Если этот флаг ложный , это означает, что год «неизвестен». Это означает, что вам нужно проверить один примитив (логическое значение), чтобы узнать, есть ли у вас значение, а если да, то проверить другой примитив (целое число).

Значения Sentinel часто приводят к нестабильному коду, поэтому стоит приложить усилия, чтобы избежать значение дозорного, если вы не уверены, что это никогда не будет вариантом использования.

2
ответ дан 27 November 2019 в 20:12
поделиться

Вы можете использовать обычный int, но используйте такое значение, как Integer. MAX_VALUE или Integer.MIN_VALUE , которые определены константами как ваша недопустимая дата. Также более очевидно, что -1 или низкое отрицательное значение недействительно, это определенно не будет выглядеть как четырехзначная дата, которую мы привыкли видеть.

1
ответ дан 27 November 2019 в 20:12
поделиться

Если у вас есть целое число и вы обеспокоены тем, что произвольное значение null может быть перепутано с реальным значением, вы можете использовать вместо него long. Это более эффективно, чем использование целого числа, и Long.MIN_VALUE не находится рядом с любым допустимым значением int.

1
ответ дан 27 November 2019 в 20:12
поделиться

Что не так с java.lang.Integer? Это разумное решение, если только вы не храните очень большие количества этого значения.

Если вы хотите использовать примитивы, значение -1 также будет хорошим решением. Единственный другой вариант, который у вас есть, - это использовать отдельный логический флаг, как кто-то уже предлагал. Выбери свой яд :)

PS: черт тебя побери, я пытался уйти с небольшой белой ложью о объектах и ​​структурах. Я хотел сказать, что он использует больше памяти, аналогично методу логического флага, хотя синтаксически тип, допускающий значение NULL, конечно, лучше. Кроме того, я не был уверен, что кто-то с опытом работы с Java поймет, что я имел в виду с struct .

0
ответ дан 27 November 2019 в 20:12
поделиться

java.lang.Integer является разумным для этого случая. В нем уже реализован Serializable, так что вы можете сохранить на HDD только поле year и загрузить его обратно.

0
ответ дан 27 November 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: