Да. Существует.
++ оператор может или не может быть определен как функция. Для типов примитивов (интервал, дважды...) встроены операторы, таким образом, компилятор, вероятно, будет в состоянии оптимизировать Ваш код. Но в случае объекта, который определяет ++, вещи оператора отличаются.
оператор ++ (международная) функция должна создать копию. Это вызвано тем, что постфикс ++, как ожидают, возвратит различное значение, чем, что он содержит: это должно содержать свое значение во временной переменной, увеличить его значение и возвратить временный файл. В случае оператора ++ (), префикс ++, нет никакой потребности создать копию: объект может увеличить себя и затем просто возвратить себя.
Вот иллюстрация точки:
struct C
{
C& operator++(); // prefix
C operator++(int); // postfix
private:
int i_;
};
C& C::operator++()
{
++i_;
return *this; // self, no copy created
}
C C::operator++(int ignored_dummy_value)
{
C t(*this);
++(*this);
return t; // return a copy
}
Каждый раз, когда Вы называете оператор ++ (интервал), необходимо создать копию, и компилятор ничего не может делать с этим. Когда дали выбор, используйте оператор ++ (); этим путем Вы не сохраняете копию. Это могло бы быть значительно в случае многих инкрементов (большой цикл?) и/или большие объекты.
Некоторые из них есть на странице проекта Guice. Вот ссылка на первый , а остальные вы можете увидеть на боковой панели.
Тем не менее, я думаю, было бы здорово, если бы другие разместили и проголосовали здесь. Затем мы сможем написать лучшие из них для страниц Guice.
Я всегда считал, что внедрение конструктора в поля final - лучшая практика. Это сводит к минимуму изменчивое состояние и упрощает понимание класса, делая формальные зависимости класса явными.
public class MyClass {
private final MyDependency dependency;
@Inject
public MyClass(MyDependency dependency) {
this.dependency = dependency;
}
}