Да, == прекрасен - там, как гарантируют, будет просто единственной ссылкой для каждого значения.
Однако существует лучший способ записать Ваш круглый метод:
public int round(RoundingMode roundingMode) {
switch (roundingMode) {
case HALF_UP:
//do something
break;
case HALF_EVEN:
//do something
break;
// etc
}
}
даже лучше способ сделать это должно поместить функциональность в самом перечислении, таким образом, Вы могли просто звонить roundingMode.round(someValue)
. Это добирается до сути перечислений Java - они объектно-ориентированы перечисления, в отличие от "именованных значений", найденных в другом месте.
РЕДАКТИРОВАНИЕ: спецификация не очень ясна, но раздел 8.9 состояния:
ножка перечислимой литеры может содержать перечислимые константы. Перечислимая константа определяет экземпляр перечислимого типа. Перечислимый тип не имеет никаких экземпляров кроме определенных его перечислимыми константами.
Я бы не стал использовать здесь производительность как решающий фактор - и, честно говоря, я не думаю, что есть какая-либо измеримая разница в производительности между этими двумя случаями.
Я всегда буду использовать случай №2 - почему? Потому что, на мой взгляд, вы должны помещать только фактические критерии, которые устанавливают JOIN между двумя таблицами, в предложение JOIN - все остальное должно быть в предложении WHERE.
Просто вопрос сохранения вещей в чистоте и размещения вещей там, где они принадлежат, IMO.
Очевидно, есть случаи с ЛЕВЫМИ ВНЕШНИМИ СОЕДИНЕНИЯми, где размещение критериев действительно имеет значение с точки зрения того, какие результаты будут возвращены - эти случаи, конечно, будут исключены из моей рекомендации.
Марк
]Вы можете запустить программу оценки плана выполнения и профилировщик sql, чтобы увидеть, как они соотносятся друг с другом.
Однако в соответствии с этим MVP SQL Server они семантически одинаковы под капотом:
http://www.eggheadcafe.com/conversation.aspx?messageid=29145383&threadid=29145379
Я не думаю, что вы найдете окончательный ответ на этот вопрос, который применим ко всем случаям. Эти 2 не всегда взаимозаменяемы - поскольку для некоторых запросов (некоторые левые соединения) вы получите разные результаты, поместив критерии в строку WHERE vs FROM.
В вашем случае вам следует оценить оба этих запроса. В SSMS вы можете просмотреть предполагаемый и фактический планы выполнения обоих этих запросов - это было бы хорошим первым шагом в определении того, какой из них более оптимальный. Вы также можете просматривать время и количество операций ввода-вывода для каждого (установить время статистики, установить статистику io) - и это также даст вам информацию для принятия решения.
В случае запросов в вашем вопросе - я бы Готов поспорить, что у них обоих будет один и тот же план запроса - так что в этом случае это может не иметь значения, но в других случаях это может потенциально привести к другим планам.
Попробуйте это, чтобы увидеть разницу между 2 ...
SET STATISTICS IO ON
SET STATISTICS TIME ON
select salesman.salesmanid,
max(sales.quantity)
from salesmaninner join sales on salesman.salesmanid =sales.salesmanid
and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid
select salesman.salesmanid,
max(sales.quantity)
from salesmaninner join sales on salesman.salesmanid = sales.salesmanid
where sales.salesdate < salesman.promotiondate
group by salesman.salesmanid
SET STATISTICS TIME OFF
SET STATISTICS IO OFF
Это может показаться легкомысленным, но ответом будет тот запрос, для которого анализатор запросов выдает наиболее эффективный план.
На мой взгляд, они кажутся эквивалентными, поэтому анализатор запросов может можно разработать идентичные планы, но вам придется протестировать.
Ознакомьтесь с расчетным планом выполнения в управлении SQL Студия !! Как уже говорили другие, вы во власти анализатора, что бы вы ни делали, поэтому доверяйте его оценкам. Я предполагаю, что те двое, которые вы предоставили, составят один и тот же план.
Если это попытка изменить культуру разработки, выберите тот, который дает вам лучший план; для тех, которые идентичны, следуйте культуре
. Я прокомментировал это в других сообщениях о «эффективности», подобных этому (он и искренний, и саркастический) - если здесь ваши узкие места, то дайте пять вам и ваша команда.
Neither is more efficient, using the WHERE method is considered the old way to do so (http://msdn.microsoft.com/en-us/library/ms190014.aspx). YOu can look at the execution plan and see they do the same thing.