Java анонимные классы vs. C# (дубль 3)

6yrop

полтора года назад :grin: , я тут писал "". В том треде за мной остался хороший краткий пример, который демонстрирует преимущества Java анонимных классов. Сейчас натолкнулся на метод в самом .NET Framework System.Linq.Enumerable.Distinct(this source, comparer)

{
...
cells..Distinct(new CellEqualityComparer
...
}

private class CellEqualityComparer : IEqualityComparer<ICell>
{
public bool Equals(ICell x, ICell y)
{
return GetKey(x) == GetKey(y);
}

public int GetHashCode(ICell obj)
{
return GetKey(obj).GetHashCode;
}
}

Это еще хорошо, что метод GetKey оказался статическим, а если бы он был метод инстанса, то пришлось бы еще в конструкторе передавать ссылку на внешний класс.
Т.е. если нужен один метод, то мы имеет элегантную запись через лямбда выражения, а если добавляем второй метод, то получаем вот такие агрегаты. Как-то это неконсистентно всё выглядит.

timefim

Как-то это неконсистентно всё выглядит.
Нашол где ее искать.

katrin2201

Как-то это неконсистентно всё выглядит.
Фигня. Джавашные дженерики веселее!

// This is to work around Java's pathetic implementation (if you can call it that) of generic types
@SuppressWarnings("unchecked")
private static <T> Class<List<T>> listOf(@SuppressWarnings("unused")Class<T> elementClass) {
// Note: the cast to Class<?> is not redundant, no matter what your IDE tells you
return (Class<List<T>>) (Class<?>) List.class;
}


public class GenericHibernateDAO<T, ID> implements GenericDAO<T, ID>, PreconfigDAO
{

private Class<T> persistentClass;
private String tablename;
private EntityManager em;

@SuppressWarnings("unchecked")
public GenericHibernateDAO
{
this.persistentClass = (Class<T>) ParameterizedType) getClass.getGenericSuperclass.getActualTypeArguments[0];
tablename = persistentClass.getName;
}

...

ЗЫ Код не мой, но оч мне нравиццо =)

Dasar

как идея, можно что такое сделать:

cells..Distinct(new Mock<IEqualityComparer<ICell>>
{
Equals = (x,y)=>GetKey(x)==GetKey(y
GetHashCode = x => GetKey(x).GetHashCode
});

agaaaa

cells.Distinct({ new IEqualityComparer with member x.Equals (a, b) = a = b })

угадай язык ;)

6yrop

т.е. каждый интерфейс сопровождать своим классом Mock? (набор свойств Mock класса соответствует интерфейсу). Неоправданное усложнение.

6yrop

code:cells.Distinct({ new IEqualityComparer with member x.Equals (a, b) = a = b })
угадай язык
читается не очень удобно, не понятно к чему относится первый метод, к чему второй. Если я поменяю местами методы в интерфейсе, твою строчку тоже менять?

agaaaa

Не понимаю. Какой ещё первый метод? В интерфейсе всего один метод - Equals.
Distinct, очевидно, относится к cells

6yrop

В интерфейсе всего один метод - Equals.
ты про какой интерфейс?
в интерфейсе IEqualityComparer из первого поста два метода.

agaaaa

А, не обратил внимания.
Ну тогда будет так:

cells.Distinct({ new IEqualityComparer with
member x.Equals (a, b) = a = b
member x.GetHashCode(object obj) = obj.ToString.ToLower.GetHashCode})

danilov

> x.GetHashCode(object obj) = obj.ToString.ToLower.GetHashCode
Ох, этож где такой лёгкий хэшкод может понадобиться?
Оставить комментарий
Имя или ник:
Комментарий: