Насколько мне известно, нет собственного решения JPA для обеспечения значений по умолчанию. Вот мой обходной путь:
Решение без переноса базы данных
@Column(columnDefinition="tinyint(1) default 1")
private boolean include;
Java-ориентированное решение
private boolean include = true;
Шаблон Java плюс Plus Builder
@Column(nullable = false)
private Boolean include;
...
public static class Builder {
private Boolean include = true; // Here it comes your default value
public Builder include (Boolean include ) {
this.include = include ;
return this;
}
// Use the pattern builder whenever you need to persist a new entity.
public MyEntity build() {
MyEntity myEntity = new MyEntity ();
myEntity .setinclude (include );
return myEntity;
}
...
}
Это мой любимый и менее навязчивый. По сути, он делегирует задачу по определению значения по умолчанию для шаблона Builder в вашей сущности.
Я считаю, что нужно всегда использовать ++ и - отдельно в одной строке, например:
i++;
array[i] = foo;
вместо
array[++i] = foo;
Все, что выходит за рамки этого, может сбивать с толку некоторых программистов и является просто не стоит на мой взгляд. Циклы For являются исключением, поскольку использование оператора приращения является идиоматическим и поэтому всегда понятным.
«До» и «после» природа операторов инкремента и декремента может сбивать с толку тех, кто с ними не знаком; это один из способов, которым они могут быть хитрыми.
Является ли Fortran языком C-подобным? В нем нет ни ++, ни -. Вот , как вы пишете цикл :
integer i, n, sum
sum = 0
do 10 i = 1, n
sum = sum + i
write(*,*) 'i =', i
write(*,*) 'sum =', sum
10 continue
Элемент индекса i увеличивается в соответствии с правилами языка каждый раз в цикле. Если вы хотите увеличить значение, отличное от 1, например, считать в обратном порядке на два, синтаксис ...
integer i
do 20 i = 10, 1, -2
write(*,*) 'i =', i
20 continue
Python C-подобен? Он использует диапазон и понимание списков и другие синтаксисы, чтобы обойти необходимость увеличения индекса:
print range(10,1,-2) # prints [10,8.6.4.2]
[x*x for x in range(1,10)] # returns [1,4,9,16 ... ]
Таким образом, на основе этого элементарного исследования ровно двух альтернатив разработчики языка могут избегать ++ и - предвидя варианты использования и предоставляя альтернативный синтаксис.
Являются ли Фортран и Python в меньшей степени магнитом для ошибок, чем процедурные языки, в которых есть ++ и -? У меня нет доказательств.
Я утверждаю, что Фортран и Python похожи на C, потому что я никогда не встречал человека, свободно владеющего C, который не мог бы с точностью 90% правильно угадать намерение необфусцированного Fortran или Python.
разработчики языков могут избегать ++ и -, предвидя варианты использования и предоставляя альтернативный синтаксис.Являются ли Fortran и Python в меньшей степени магнитом для ошибок, чем процедурные языки, в которых есть ++ и -? У меня нет доказательств.
Я утверждаю, что Фортран и Python похожи на C, потому что я никогда не встречал человека, свободно владеющего C, который не мог бы с точностью 90% правильно угадать намерение необфусцированного Fortran или Python.
разработчики языков могут избегать ++ и -, предвидя варианты использования и предоставляя альтернативный синтаксис.Являются ли Fortran и Python в меньшей степени магнитом для ошибок, чем процедурные языки, в которых есть ++ и -? У меня нет доказательств.
Я утверждаю, что Фортран и Python похожи на C, потому что я никогда не встречал человека, свободно владеющего C, который не мог бы с точностью 90% правильно угадать намерение необфусцированного Fortran или Python.
Если вы прочтете JavaScript The Good Parts, вы увидите, что Крокфорд заменил i ++ в цикле for на i + = 1 (не i = i + 1). Это довольно чисто и читабельно, и вряд ли превратится во что-то «хитрое».
Крокфорд запретил автоинкремент и автоматическое уменьшение в параметре в jsLint. Вы выбираете, следовать ли совету или нет.
Мое личное правило - не делать ничего в сочетании с автоинкрементом или автоматическим декрементом.
Я узнал из многолетнего опыта в C, что я не получаю переполнения буфера ( или индекс массива вне пределов), если я буду использовать его просто. Но я обнаружил, что у меня действительно происходит переполнение буфера, если я попадаю в «чрезмерно сложную» практику выполнения других вещей в том же операторе.
Итак, для моих собственных правил использование i ++ в качестве приращения в для цикла в порядке.
Мое личное правило - не делать ничего в сочетании с автоинкрементом или автоматическим декрементом.
Из многолетнего опыта работы с C я узнал, что я не получаю переполнения буфера (или выхода индекса массива за границы), если я сохраняю использовать это просто. Но я обнаружил, что у меня действительно происходит переполнение буфера, если я попадаю в «чрезмерно сложную» практику выполнения других вещей в том же операторе.
Итак, для моих собственных правил использование i ++ в качестве приращения в для цикла в порядке.
Мое личное правило - не делать ничего в сочетании с автоинкрементом или автоматическим декрементом.
Из многолетнего опыта работы с C я узнал, что я не получаю переполнения буфера (или выхода индекса массива за границы), если я сохраняю использовать это просто. Но я обнаружил, что у меня действительно происходит переполнение буфера, если я попадаю в «чрезмерно сложную» практику выполнения других вещей в том же операторе.
Итак, для моих собственных правил использование i ++ в качестве приращения в для цикла в порядке.
Рассмотрим следующий код
int a[10];
a[0] = 0;
a[1] = 0;
a[2] = 0;
a[3] = 0;
int i = 0;
a[i++] = i++;
a[i++] = i++;
a[i++] = i++;
, поскольку i ++ вычисляется дважды, вывод (из отладчика vs2005)
[0] 0 int
[1] 0 int
[2] 2 int
[3] 0 int
[4] 4 int
Теперь рассмотрим следующий код:
int a[10];
a[0] = 0;
a[1] = 0;
a[2] = 0;
a[3] = 0;
int i = 0;
a[++i] = ++i;
a[++i] = ++i;
a[++i] = ++i;
Обратите внимание, что вывод такой же. Теперь вы можете подумать, что ++ i и i ++ - одно и то же. Они не
[0] 0 int
[1] 0 int
[2] 2 int
[3] 0 int
[4] 4 int
Наконец, рассмотрим этот код
int a[10];
a[0] = 0;
a[1] = 0;
a[2] = 0;
a[3] = 0;
int i = 0;
a[++i] = i++;
a[++i] = i++;
a[++i] = i++;
Теперь результат:
[0] 0 int
[1] 1 int
[2] 0 int
[3] 3 int
[4] 0 int
[5] 5 int
Значит, они не одно и то же, смешивание обоих приводит к не столь интуитивному поведению. Я думаю, что циклы for подходят для ++, но будьте осторожны, когда у вас есть несколько символов ++ в одной строке или одной инструкции
В C есть история выполнения таких вещей, как:
while (*a++ = *b++);
для копирования строки, возможно, это источник чрезмерного обмана, о котором он говорит.
И всегда возникает вопрос, что на самом деле делают
++i = i++;
или
i = i++ + ++i;
. Он определен в некоторых языках, а в других нет никакой гарантии, что произойдет.
Если отбросить эти примеры, я не думаю, что есть что-то более идиоматичное, чем цикл for, который использует ++
для увеличения. В некоторых случаях можно обойтись с помощью цикла foreach или цикла while, который проверяет другое условие. Но искажать свой код, пытаясь избежать использования приращения, просто смешно.
Я откровенно смущен этим советом. Часть меня задается вопросом, связано ли это с отсутствием опыта (воображаемого или фактического) с кодировщиками javascript.
Я понимаю, как кто-то, просто «взламывающий» какой-то пример кода, может совершить невинную ошибку с ++ и -, но я не понимаю, почему опытный профессионал избегал бы их.
Я не знаю, было ли это частью его рассуждений, но если вы воспользуетесь плохо написанной программой минификации, она может превратить x ++ + y
в х +++ у
. Но опять же, плохо написанный инструмент может нанести любой ущерб.