Оператор ==
проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals()
проверьте фактическое содержимое строки (значение).
Обратите внимание, что метод .equals()
принадлежит классу Object
(суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.
String s1 = "Stack Overflow";
String s2 = "Stack Overflow";
s1 == s2; //true
s1.equals(s2); //true
Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле. String s1 = new String("Stack Overflow");
String s2 = new String("Stack Overflow");
s1 == s2; //false
s1.equals(s2); //true
Причина. Если вы создаете объект String с использованием ключевого слова new
, ему выделяется отдельное пространство в куче. Функтор является 'понятием' уровня синтаксиса - он упаковывает код в объекте, который можно рассматривать синтаксически как указатель функции - т.е. это можно 'назвать' путем помещения списка параметров в скобках после него. В C++ Вы могли сделать класс функтором переопределяющим оператором ().
Команда А в шаблоне "команда" является объектом что пакеты некоторая выполнимая функциональность, но нет никакого требования для него, чтобы быть функтором. Например, это мог быть класс, который реализует интерфейс ICommand, позволение его команды быть выполненным вызовом Делает ().
Здесь прибывает ответ из GOF:
Coplien описывает, как реализовать функторы, объекты, которые являются функциями в C++ [Cop92]. Он достигает степени прозрачности в их использовании путем перегрузки оператора вызова функции (оператор ()). Шаблон "команда" отличается; его фокус находится на поддержание привязки между получателем и функцией (т.е. действие), не всего поддержание функции .
Функтор является реализацией, способ заставить объект вести себя как функция.
'Шаблон "команда"' является шаблоном разработки.
функтор является одним способом реализовать 'Шаблон "команда"'.
Я думаю о функторе, как являющемся компонентом шаблона "команда", который также включает другую инфраструктуру, такую как получатели команды и invoker.
Из описания страница Apache Commons Functor :
<час>функтор А является функцией, которой можно управлять как объект или объект, представляющий единственную, родовую функцию.
Функторы поддерживают и поощряют много мощных методов программирования включая:
Шаблон "команда" используется в Java, потому что у нас нет закрытий в Java. Функторы являются попыткой реализовать закрытия.
языку А с закрытиями не нужен Шаблон "команда".