Это вполне приемлемо для someObj.someName != someObj.someName
, чтобы быть правдой, странно, как может показаться.
Причина (как указано в других) заключается в том, что атрибуты соответствуют действительным функциям RPC. В случае атрибутов readonly
они просто сопоставляются с сеттерами, а для атрибутов без чтения доступны сеттер и геттер, неявно созданный для вас, когда IDL скомпилируется. Но важно знать, что атрибут IDL имеет динамическое, управляемое сервером значение RPC.
IDL указывает контракт на распределенные взаимодействия, который может быть выполнен во время выполнения между независимыми, развязанными объектами. Почти каждое взаимодействие с типом IDL приведет к вызову RPC, и любое возвращаемое значение будет зависеть от того, что сервер решает вернуться.
Если атрибутом является, скажем, currentTime
, то вы, возможно, получите текущее время работы сервера с каждым извлечением значения. В этом случае someObj.currentTime != someObj.currentTime
, скорее всего, всегда будет истинным (предполагая, что используемая гранулярность времени меньше, чем комбинированное время округления для двух вызовов RPC).
Если атрибутом является currentBankBalance
, то вы все равно можете иметь значение someObj.currentBankBalance != someObj.currentBankBalance
, так как в другом месте могут быть другие клиенты, которые постоянно изменяют атрибут через функцию setter, поэтому вы также имеете дело с состоянием гонки.
Все, что сказано, если вы очень формально смотрите спецификацию IDL, в нем нет языка, который фактически требует, чтобы параметр/доступ к атрибуту должен приводить к вызову RPC на сервер. Он может обслуживаться ORB на стороне клиента. Фактически, это то, что некоторые поставщики ORB воспользовались преимуществами расписания CORBA. Я работал на Orbix ORB, и у нас была функция под названием Smart Proxies - что-то, что позволило бы разработчику приложения перегружать предоставленные ORB клиентские прокси по умолчанию (которые всегда будут перенаправлять все вызовы атрибутов на сервер, на котором размещается целевой объект) с пользовательскими функциональности (скажем, кэшировать значения атрибутов и возвращать локальную копию без накладных расходов сети или сервера).
Таким образом, вы должны быть предельно четкими и точными в отношении того, что вы пытаетесь проверить формально. Учитывая динамический и недетерминированный характер значений, которые они могут вернуть (и тот факт, что клиентские ORB могут вести себя по-другому друг от друга и по-прежнему соответствовать требованиям CORBA) , вы можете только надежно ожидать, что атрибуты IDL будут сопоставляться с геттерами и сеттерами который может использоваться для извлечения или установки значения. Фактически ожидаемых значений нет.
Я не понимаю, почему «someObj.someName! = SomeObj.someName» может быть ложным. если и сравнить один и тот же объект, это будет всегда верно. PS: Вы правильно используете Java? – Makah
Нет, это не язык программирования. Это IDL, язык описания интерфейсов. Мой вопрос касается семантики реализаций интерфейсов IDL; то есть действительная реализация. –
I thik это было о OMG CORBA IDL – Makah