Другой случай, когда это обычно нормально, находится в базе данных отчетов, где данные, возможно, уже поставлены и записи просто не происходят. В этом случае параметр должен быть установлен на уровне базы данных или таблицы администратором, изменив уровень изоляции по умолчанию.
В общем случае: вы можете использовать его, когда вы очень уверен, что читать старые данные можно. Важно помнить, что его очень легко получить это неправильно . Например, даже если в момент написания запроса все нормально, уверены ли вы, что в будущем в базе данных не будет изменений, чтобы сделать эти обновления более важными?
Я также сделаю предположение, что это, вероятно, не хорошая идея в банковском приложении. Или приложение инвентаризации. Или где бы вы ни думали о транзакциях.
Я попытался дублировать это с более широкой группой контекстов присваивания:
final byte b = 12;
Byte b2 = b;
Character c = b; // Only an error if b isn't final
char c2 = b; // Only an error if b isn't final
Short s = b; // Only an error if b isn't final
short s2 = b;
Integer i = b; // Error, as indicated in the question
int i2 = b;
Long l = b; // Also an error
long l2 = b;
Float f = b; // Also an error
float f2 = b;
Double d = b; // Also an error
double d2 = b;
Назначение не только для Integer
, но и для Float
, a Long
или Double
также является ошибкой.
Интересно, что если исходное объявление b
было NOT final
, то при присвоении Character
, char
или Short
.
Раздел 5.2 JLS проливает немного света на предмет контекстов назначения и их разрешенные преобразования.
Контексты назначения позволяют использовать одного из следующих:
blockquote>
- преобразование идентичности (§5.1.1)
- расширение примитивного преобразования (п. 5.1.2)
- a (§5.1.5)
- преобразование бокса (§5.1.7), за которым следует расширенное ссылочное преобразование
- преобразование для распаковки (п. 5.1.8) путем расширения примитивного преобразования.
Это охватывает все преобразования для более простых примитивных переменных, которые всегда разрешены, независимо от того,
b
-final
или нет. (Это выполняется, еслиb
не является отрицательным, и в этом случае сбой при отсутствии знакаchar
(илиCharacter
).) Продолжение:Кроме того, если выражение постоянное выражение (§15.28) типа byte, short, char или int:
blockquote>
- Сужение примитивного преобразования может быть использовано, если тип переменной является байтом, коротким или char, и значение константного выражения представляется в типе переменной.
- Сужение примитивного преобразования, за которым следует преобразование бокса, может использоваться, если тип переменной: Byte и значение константного выражения представляется в байте типа. Короткое значение, а значение константного выражения представляется в типе short. Символ и значение константного выражения представляются в типе char.
Поскольку
b
являетсяfinal
, выражениеb
является константным выражением , позволяя ему сужаться отint
постоянное выражение12
-byte
,char
илиshort
, а затем помечено в полеByte
,Character
илиShort
, но странно, а неInteger
или что-либо «выше». Единственное возможное объяснение, о котором я могу думать, состоит в том, что константные выражения, которые подвержены примитивному суживающему преобразованию, не могут быть явно разрешены кInteger
,Long
,Float
илиDouble
.Если
b
неfinal
, то сужение, сопровождаемое боксом, недопустимо, а не константное выражение не может быть продвинуто сbyte
доchar
.