Каков наилучший способ представления составного ключа (ключ, содержащий два значения) класса и логического - PullRequest
2 голосов
/ 09 июня 2009
HashMap<Pair<Class<T>,Boolean>,String> abc = new HashMap<Pair<Class<T>,Boolean>,String>();

Как лучше всего представлять пару здесь ... Java предлагает что-нибудь?

Мой ключ всегда будет парой {class, boolean}.

Спасибо!

Ответы [ 5 ]

1 голос
/ 09 июня 2009

Я бы создал новый класс-обертку и использовал бы его в качестве ключа

class CustomKey
{
   String cls;
   boolean booleanValue;    
   // override equals and hashcode
}
0 голосов
/ 09 июня 2009

У меня есть два подхода ... создайте ключ {class, Boolean} -> {string}, или я мог бы также сделать это.

{class} -> {Boolean, string}

у первого подхода есть 1 уровень косвенности, у второго - 2 ... каковы здесь плюсы и минусы? Второй подход плох?

0 голосов
/ 09 июня 2009

В Java нет класса с именем Pair; но есть интерфейс Map.Entry<K,V>, и есть две его публичные реализации: AbstractMap.SimpleEntry и AbstractMap.SimpleImmutableEntry.

Если вам неприятно использовать вложенные классы непосредственно в коде, вы всегда можете создать класс Pair:

public class Pair<Type1, Type2> extends AbstractMap.SimpleEntry<Type1, Type2> {
    public Pair(Type1 t1, Type2 t2) {
        super(t1, t2);
    }
}

Или вы можете написать свое собственное так:

public final class Pair<Type1, Type2> {
    public final Type1 first;
    public final Type2 second;

    public Pair(Type1 first, Type2 second) {
        this.first = first;
        this.second = second;
    }

    /**
     * Factory method to ease the pain of generics.
     */
    public static <T1, T2> Pair of(T1 first, T2 second) {
        return new Pair<T1, T2>(first, second);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;

        final Pair other = (Pair) obj; // no generics needed here
        if (this.first != other.first &&
            (this.first == null || !this.first.equals(other.first)))
            return false;
        if (this.second != other.second &&
            (this.second == null || !this.second.equals(other.second)))
            return false;
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 37 * hash + (this.first != null ? this.first.hashCode() : 0);
        hash = 37 * hash + (this.second != null ? this.second.hashCode() : 0);
        return hash;
    }
}
0 голосов
/ 09 июня 2009

В настоящее время у Java нет типа Pair или чего-либо подобного. Я также не нашел один в общих Apache, хотя возможно, что я пропустил что-то. В любом случае обычно в этом случае создается небольшой неизменяемый класс данных:

public class Key<T> {
  private final Class<T> cls;
  private final boolean flag;

  public Key(Class<T> cls, boolean flag) {
    this.cls = cls;
    this.flag = flag;   }

  public Class<T> getClass() {
    return cls;   }

  public boolean getFlag() {
    return flag;   }

  // equals and hashCode *must* be implemented -- see Effective Java for examples
}

Некоторые люди в этом случае вместо этого будут использовать публичные финальные методы - это вопрос вкуса плюс вероятность того, что класс станет более сложным.

Я видел пару Pair или Tuple классов, реализованных, если есть потребность в классе вне одного случая (или если у разработчиков есть функциональный фон).

0 голосов
/ 09 июня 2009

В библиотеке Java нет класса Pair. Там может быть один в JDK7. Многие большие базы кода заканчиваются одной.

Тем не менее, вы уверены, что Pair действительно то, что вы хотите. Хорошо инкапсулированный класс с соответствующим поведением может быть более подходящим. И Boolean, и Pair и отличаются тем, что не имеют определенного значения.

Если вам действительно нужна эффективность, вы можете пойти на две IdentityHashMap<Class<T>,String> с.

FWIW, AFAIK, ближайший к Pair<Class<T>,Boolean> в библиотеке Java - java.util.concurrent.atomic.AtomicMarkableReference, но вам нужно расширить его, чтобы переопределить equals и hashCode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...