Регистрация  |  Вход

Антидубликатор экземпляров классов

Доброго дня. Столкнулся с такой проблемой: Есть два экземпляра класса. Надо их сравнить. Метод эквалс тоже не проходит. Пришлось сравнить по полям. Хорошо что для сравнения было три поля. А если бы 30? Какое есть еще решение?

Доброго дня. Столкнулся с такой проблемой: Есть два экземпляра класса. Надо их сравнить. Метод эквалс тоже не проходит. Пришлось сравнить по полям. Хорошо что для сравнения было три поля. А если бы 30?  Какое есть еще решение?

AkiraDio
Доброго дня. Столкнулся с такой проблемой: Есть два экземпляра класса. Надо их сравнить. Метод эквалс тоже не проходит. Пришлось сравнить по полям. Хорошо что для сравнения было три поля. А если бы 30? Какое есть еще решение?

Наверное универсального метода сравнения двух экземпляров классав по всем полям нет. Эта вопрос достаточно индивидуальный под конкретную задачу. Я на практике никогда не сталкивался со сравнением по всем полям. Обычно в экземпляре класса или объекте есть ключивые поля, по которым собственно и нужно сравнивать.

В Apex недавно из Java пришли такие замечательные методы для класса как equals и hashCode (ох как любят джависты эти методы. Все мозги мне помню высушили на собеседованиях)

Их переназначение и предназначено для правильного сравнения двух экземпляров класса. Вернее переназначение метода equals.

Вот источники с дополнительной информацией, может будет полезно:
https://www.salesforce.com/us/developer/docs/apexcode/Content/langCon_apex_collections_maps_keys_userdefined.htm
http://share-salesforce.blogspot.co.uk/2013/06/apex-adding-equals-and-hashcode-methods.html

[quote="AkiraDio"]Доброго дня. Столкнулся с такой проблемой: Есть два экземпляра класса. Надо их сравнить. Метод эквалс тоже не проходит. Пришлось сравнить по полям. Хорошо что для сравнения было три поля. А если бы 30?  Какое есть еще решение?[/quote]

Наверное универсального метода сравнения двух экземпляров классав по всем полям нет. Эта вопрос достаточно индивидуальный под конкретную задачу. Я на практике никогда не сталкивался со сравнением по всем полям. Обычно в экземпляре класса или объекте есть ключивые поля, по которым собственно и нужно сравнивать.

В Apex недавно из Java пришли такие замечательные методы для класса как [b]equals[/b] и [b]hashCode[/b] (ох как любят джависты эти методы. Все мозги мне помню высушили на собеседованиях)

Их переназначение и предназначено для правильного сравнения двух экземпляров класса. Вернее переназначение метода equals.

Вот источники с дополнительной информацией, может будет полезно:
[url]https://www.salesforce.com/us/developer/docs/apexcode/Content/langCon_apex_collections_maps_keys_userdefined.htm[/url] 
[url]http://share-salesforce.blogspot.co.uk/2013/06/apex-adding-equals-and-hashcode-methods.html[/url]

Согласен с Димой это вопрос сугубо индивидуальный,но даже в не этом дело, у меня стояла задача написать метод который копируют значения всех полей из одного контакта в другой контакт.Получился не большой метод строк 20 так что это не так страшно. <!-- s:!: --><img src="{SMILIES_PATH}/icon_exclaim.gif" alt=":!:" title="Восклицание" /><!-- s:!: -->
Так же возможно может помочь метод Merge : http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dml_merge.htm
Иногда про него забывают. <!-- s:geek: --><img src="{SMILIES_PATH}/icon_e_geek.gif" alt=":geek:" title="Ботан" /><!-- s:geek: -->

Согласен с Димой это вопрос сугубо индивидуальный,но даже в не этом дело, у меня стояла задача написать метод который копируют значения всех полей из одного контакта в другой контакт.Получился не большой метод строк 20 так что это не так страшно. :)  <!-- s:!: --><img src="{SMILIES_PATH}/icon_exclaim.gif" alt=":!:" title="Восклицание" /><!-- s:!: --> 
Так же возможно может помочь метод Merge : [url]http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dml_merge.htm[/url]
Иногда про него забывают. <!-- s:geek: --><img src="{SMILIES_PATH}/icon_e_geek.gif" alt=":geek:" title="Ботан" /><!-- s:geek: -->

Sergey Prichepo
Получился не большой метод строк 20 так что это не так страшно.

Сергей, покажи код, если это не коммерческая тайна Я думаю всем будет интересно и полезно :)

[quote="Sergey Prichepo"]Получился не большой метод строк 20 так что это не так страшно.[/quote]

Сергей, покажи код, если это не коммерческая тайна :) Я думаю всем будет интересно и полезно :)

Sergey Prichepo
Так же возможно может помочь метод Merge : http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dml_merge.htm
Иногда про него забывают. <!-- s:geek: --><img src="{SMILIES_PATH}/icon_e_geek.gif" alt=":geek:" title="Ботан" /><!-- s:geek: -->

Интересный метод, никогда не видел и не пользовался.

Вот только описание не очень сильно помогло понять что в результате получится. Что будет на выходе в полях master record?

"The merge statement merges up to three records of the same sObject type into one of the records, deleting the others, and re-parenting any related records."

Вот пример из документации.

List<Account> ls = new List<Account>{new Account(name='Acme Inc.'),new Account(name='Acme')};
insert ls;
Account masterAcct = [SELECT Id, Name FROM Account WHERE Name = 'Acme Inc.' LIMIT 1];
Account mergeAcct = [SELECT Id, Name FROM Account WHERE Name = 'Acme' LIMIT 1];
try {
merge masterAcct mergeAcct;
} catch (DmlException e) {
// Process exception here
}

Что в результате получим в Базе Данных?

[quote="Sergey Prichepo"]Так же возможно может помочь метод Merge : [url]http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dml_merge.htm[/url]
Иногда про него забывают. <!-- s:geek: --><img src="{SMILIES_PATH}/icon_e_geek.gif" alt=":geek:" title="Ботан" /><!-- s:geek: -->[/quote]

Интересный метод, никогда не видел и не пользовался.

Вот только описание не очень сильно помогло понять что в результате получится. Что будет на выходе в полях master record?

"The merge statement merges up to three records of the same sObject type into one of the records, deleting the others, and re-parenting any related records."

Вот пример из документации.

[code]List<Account> ls = new List<Account>{new Account(name='Acme Inc.'),new Account(name='Acme')};
insert ls;
Account masterAcct = [SELECT Id, Name FROM Account WHERE Name = 'Acme Inc.' LIMIT 1];
Account mergeAcct = [SELECT Id, Name FROM Account WHERE Name = 'Acme' LIMIT 1];
try {
    merge masterAcct mergeAcct;
} catch (DmlException e) {
    // Process exception here
}[/code]

Что в результате получим в Базе Данных?

Ясно. equals и hashCode не подходят для моей задачи. Ибо при использовании equals всегда приходит false. А hashCode всегда разный, даже если все поля класса заполнены одинаково.

Ясно. equals и hashCode не подходят для моей задачи. Ибо при использовании equals  всегда приходит false. А hashCode  всегда разный, даже если все поля класса заполнены одинаково.

Dmitry Shnyrev
Sergey Prichepo
Получился не большой метод строк 20 так что это не так страшно.

Сергей, покажи код, если это не коммерческая тайна Я думаю всем будет интересно и полезно :)

fieldMap = sObjectDescribe.fields.getMap();

global void updateRecords(sObject source, sObject target){


for (string key : fieldMap.keySet()){

Schema.SObjectField f = fieldMap.get(key);
Boolean access = f.getDescribe().isAccessible();

try{

if(access != false && key != 'ownerId'){
Object valueSource = source.get(key);
Object valueTarget = target.get(key);

if(valueSource != valueTarget && valueSource != null){
if ((valueTarget == false || valueTarget == true) && valueSource == null){
target.put(key, valueTarget);
}else{
target.put(key, valueSource);
}
}
}
}catch(Exception ex){}
}



Вот примерно что такое.

[quote="Dmitry Shnyrev"][quote="Sergey Prichepo"]Получился не большой метод строк 20 так что это не так страшно.[/quote]

Сергей, покажи код, если это не коммерческая тайна :) Я думаю всем будет интересно и полезно :)[/quote]

[code]fieldMap = sObjectDescribe.fields.getMap();

global void updateRecords(sObject source, sObject target){
		
        
        for (string key : fieldMap.keySet()){
           
		Schema.SObjectField f = fieldMap.get(key);  
            	Boolean access = f.getDescribe().isAccessible();
			
			try{
			
			if(access != false && key != 'ownerId'){
	                	Object valueSource = source.get(key);
	                	Object valueTarget = target.get(key);
	                
	                if(valueSource != valueTarget && valueSource != null){
	                	if ((valueTarget == false || valueTarget == true) && valueSource == null){
	                		target.put(key, valueTarget);
	                	}else{
	                		target.put(key, valueSource);
	                	}
	                }
	            }
            }catch(Exception ex){}  
        }[/code]
        
Вот примерно что такое.

Dmitry Shnyrev
Sergey Prichepo
Так же возможно может помочь метод Merge : http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dml_merge.htm
Иногда про него забывают. <!-- s:geek: --><img src="{SMILIES_PATH}/icon_e_geek.gif" alt=":geek:" title="Ботан" /><!-- s:geek: -->

Интересный метод, никогда не видел и не пользовался.

Вот только описание не очень сильно помогло понять что в результате получится. Что будет на выходе в полях master record?

"The merge statement merges up to three records of the same sObject type into one of the records, deleting the others, and re-parenting any related records."

Вот пример из документации.

List<Account> ls = new List<Account>{new Account(name='Acme Inc.'),new Account(name='Acme')};
insert ls;
Account masterAcct = [SELECT Id, Name FROM Account WHERE Name = 'Acme Inc.' LIMIT 1];
Account mergeAcct = [SELECT Id, Name FROM Account WHERE Name = 'Acme' LIMIT 1];
try {
merge masterAcct mergeAcct;
} catch (DmlException e) {
// Process exception here
}

Что в результате получим в Базе Данных?


На сколько помню должно masterAcct остаться,а так мержит остальные филды.Чесно сам один раз пользовался.я бы порекомендовал посмотреть такие ссылку http://developer.force.com/cheatsheets .

[quote="Dmitry Shnyrev"][quote="Sergey Prichepo"]Так же возможно может помочь метод Merge : [url]http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dml_merge.htm[/url]
Иногда про него забывают. <!-- s:geek: --><img src="{SMILIES_PATH}/icon_e_geek.gif" alt=":geek:" title="Ботан" /><!-- s:geek: -->[/quote]

Интересный метод, никогда не видел и не пользовался.

Вот только описание не очень сильно помогло понять что в результате получится. Что будет на выходе в полях master record?

"The merge statement merges up to three records of the same sObject type into one of the records, deleting the others, and re-parenting any related records."

Вот пример из документации.

[code]List<Account> ls = new List<Account>{new Account(name='Acme Inc.'),new Account(name='Acme')};
insert ls;
Account masterAcct = [SELECT Id, Name FROM Account WHERE Name = 'Acme Inc.' LIMIT 1];
Account mergeAcct = [SELECT Id, Name FROM Account WHERE Name = 'Acme' LIMIT 1];
try {
    merge masterAcct mergeAcct;
} catch (DmlException e) {
    // Process exception here
}[/code]

Что в результате получим в Базе Данных?[/quote]
На сколько помню должно masterAcct остаться,а так мержит остальные филды.Чесно сам один раз пользовался.я бы порекомендовал посмотреть такие ссылку [url]http://developer.force.com/cheatsheets[/url] .

AkiraDio
Ясно. equals и hashCode не подходят для моей задачи. Ибо при использовании equals всегда приходит false. А hashCode всегда разный, даже если все поля класса заполнены одинаково.

Смысл не в их использовании, а в переназначении и потом использовании.
Т.е. чтобы у тебя два объекта сравнивались правильно (по каким тебе нужно полял), необходимо в классе переназначить метод equals своей логикой и заставить его возвращать то, что тебе нужно false или true.

Если не сталкивался, то тема тяжелая для понимания. (Поэтому ее любят на собеседованиях). Почитай про эти методы для Java (на русском должно быть куча инфы).

Но я привел эти методы для примера, потому что они предназначены для твоей задачи, но никто не мешает тебе сделать свои собственные методы и сравнивать два объекта как ты хочешь.

[quote="AkiraDio"]Ясно. equals и hashCode не подходят для моей задачи. Ибо при использовании equals  всегда приходит false. А hashCode  всегда разный, даже если все поля класса заполнены одинаково.[/quote]

Смысл не в их использовании, а в переназначении и потом использовании.
Т.е. чтобы у тебя два объекта сравнивались правильно (по каким тебе нужно полял), необходимо в классе переназначить метод equals своей логикой и заставить его возвращать то, что тебе нужно false или true.

Если не сталкивался, то тема тяжелая для понимания. (Поэтому ее любят на собеседованиях). Почитай про эти методы для Java (на русском должно быть куча инфы).

Но  я привел эти методы для примера, потому что они предназначены для твоей задачи, но никто не мешает тебе сделать свои собственные методы и сравнивать два объекта как ты хочешь.

даа... что то такое нам говорили на курсах) Спс, буду вспоминать.

даа... что то такое нам говорили на курсах) Спс, буду вспоминать.