Ответ на вопрос @Andreas Krey на самом деле хорош. Все, что делает Java сложным, вы, вероятно, не должны делать.
Самые распространенные применения Pair в моем опыте были множественными возвращаемыми значениями из метода и как VALUES в хэшмапе (часто индексируются по строкам).
В последнем случае, я недавно использовал структуру данных, что-то вроде этого:
class SumHolder{MyObject trackedObject, double sum};
Существует весь ваш класс «пара», в значительной степени тот же объем кода, как общая «Пара», но с преимуществом описательных имен. Он может быть определен прямолинейно в используемом методе, который устранит типичные проблемы с общедоступными переменными и тому подобное. Другими словами, это абсолютно лучше, чем пара для этого использования (из-за названных членов) и не хуже.
Если вы действительно хотите «пару» для ключа хэш-карты, вы по существу создаете индекс с двойной клавишей. Я думаю, что это может быть тот случай, когда «пара» значительно меньше кода. Это не так просто, потому что вы могли бы заставить eclipse генерировать equals/hash на вашем небольшом классе данных, но это будет намного больше кода. Здесь пара будет быстрым исправлением, но если вам нужен хэши с двойной индексацией, то есть вам не нужен хэш с индексированием n? Решение класса данных будет расширяться, пара не будет, если вы не гнездите их!
Итак, второй случай, возвращающийся из метода, немного сложнее. Ваш класс нуждается в большей видимости (вызывающий должен увидеть его тоже). Вы можете определить его вне метода, но внутри класса точно так же, как указано выше. В этот момент ваш метод должен иметь возможность вернуть объект MyClass.SumHolder. Вызывающий получает, чтобы видеть имена возвращенных объектов, а не только «Пара». Заметим еще раз, что «Стандартная» безопасность уровня пакета довольно хороша - это достаточно ограничительно, чтобы вы не попадали в слишком большие проблемы. Лучше, чем объект «Пара».
В другом случае, я вижу, что использование для пар - это открытый api с возвращаемыми значениями для вызывающих абонентов вне вашего текущего пакета. Для этого я бы просто создал истинный объект - желательно неизменный. В конечном итоге вызывающий абонент будет делить это возвращаемое значение, и его изменение может быть проблематичным. Это еще один случай, когда объект Pair хуже - большинство пар нельзя сделать неизменным.
Еще одно преимущество для всех этих случаев: класс java расширяется, моему классу sum требуется вторая сумма и флаг «Созданный» к моменту моего завершения, мне пришлось бы выбросить пару и уйти с чем-то иначе, но если пара имела смысл, мой класс с 4 значениями по-прежнему имеет по крайней мере такой же смысл.
Я не уверен, что пользовательский класс помог бы в этом случае :) – 2011-04-23 16:49:25
«Типичная причина для этого - перебрать карты». В самом деле? – 2011-11-28 22:02:03