Неизменяемый означает, что, как только конструктор для объекта завершит выполнение, этот экземпляр не может быть изменен.
Это полезно, поскольку означает, что вы можете передавать ссылки на объект, не беспокоясь о том, что кто-то другой изменит его содержимое. Особенно при работе с параллелизмом не возникает проблем с блокировкой объектов, которые никогда не меняются
, например
class Foo
{
private final String myvar;
public Foo(final String initialValue)
{
this.myvar = initialValue;
}
public String getValue()
{
return this.myvar;
}
}
Foo
не нужно беспокоиться о том, что вызывающий абонент getValue()
может изменить текст в строке.
Если вы представляете класс, подобный Foo
, но с StringBuilder
, а не String
в качестве члена, вы можете видеть, что вызывающая сторона к getValue()
сможет изменить атрибут StringBuilder
Foo
экземпляра.
Также остерегайтесь различных видов неизменности, которые вы можете найти: Эрик Липперт написал статью в блоге об этом. По сути, у вас могут быть объекты, чей интерфейс является неизменным, но за кулисами фактически изменяемое частное состояние (и, следовательно, его нельзя безопасно разделить между потоками).
Вполне вероятно, что если вы воспользуетесь профилировщиком и посмотрите, то в конечном итоге увидите, что оптимизатор будет игнорировать это чаще, чем нет, так что в общем случае, вероятно, не сильно повлияет на увеличение или уменьшение производительности.
Это не влияет на производительность, но там текст SQL выглядит так, как будто он был искажен атакой SQL-инъекции. Уловка «1 = 1» встречается во многих атаках на основе SQL-инъекций. Вы просто рискуете, что кто-нибудь из ваших клиентов когда-нибудь развернет «черный ящик», который отслеживает трафик SQL, и вы обнаружите, что ваше приложение помечено как «взломанное». Также анализаторы исходного кода могут отметить это. Конечно, это долгий путь, но кое-что стоит поставить на карту.
Нет никакой разницы, поскольку они вычисляли константы и оптимизировались. Я использую как 1 = 1, так и 0 = 1 в списках И
И ИЛИ
, созданных вручную и сгенерированных кодом, и это не имеет никакого эффекта.
Поскольку условие всегда истинно, SQL Server игнорирует его. Вы можете проверить, запустив два запроса, один с условием, а другой без, и сравнив два фактических плана выполнения.
Альтернативой для достижения легкости комментирования является реструктуризация вашего запроса:
ВЫБРАТЬ ...
ИЗ таблицы t
ГДЕ
t. [column1] = @ param1 И
t. [column2] = @ param2 И
t. [column3] = @ param3
Затем вы можете добавить / удалить / закомментировать строки в условиях where, и SQL по-прежнему будет действительным.
Нет, SQL Server достаточно умен, чтобы исключить это условие из плана выполнения, поскольку оно всегда ИСТИНА
.
То же самое верно для Oracle, MySQL и PostgreSQL.
Для запросов любой разумной сложности разницы не будет. . Вы можете посмотреть некоторые планы выполнения, а также сравнить реальные затраты на выполнение и убедиться в этом сами.
No performance hit. Even if your WHERE clause is loaded with a large number of comparisons, this is tiny.
Best case scenario is that it's a bit-for-bit comparison. Worse case is that the digits are evaluated as integers.