Проблема, с которой вы, вероятно, столкнетесь, заключается в том, чтобы облегчить пул объектов настолько, чтобы он был дешевле, чем просто создание объектов.Вы хотите, чтобы пул был достаточно большим, чтобы у вас был довольно высокий коэффициент попадания.
По моему опыту, у вас, вероятно, будут проблемы с микротестированием.Когда вы несколько раз создаете один тип объекта в микро-бенчмарке, вы получаете гораздо лучшие результаты, чем при создании множества объектов в реальном / сложном приложении.
Проблема со многими подходами к пулу объектов заключается в том, что ониа) требует ключевой объект, который стоит столько же или больше, чем создание простого объекта, б) включает некоторую синхронизацию / блокировку, которая снова может стоить столько же, сколько создание объекта в) требует дополнительного объекта при добавлении в кэш (например,Map.Entry), что означает, что ваш рейтинг попаданий должен быть намного выше, чтобы кеш стоил того.
Самая легкая, но глупая стратегия кэширования, которую я знаю, - это использовать массив с хеш-кодом.
например,
private static final int N_POINTS = 10191; // or some large prime.
private static final Point[] POINTS = new Point[N_POINTS];
public static Point of(int x, int y, int z) {
int h = hash(x,y,z); // a simple hash function of x,y,z
int index = (h & 0x7fffffff) % N_POINTS;
Point p = POINTS[index];
if (p != null && p.x == x && p.y == y && p.z == z)
return p;
return POINTS[index] = new Point(x,y,z);
}
Примечание: массив не является потокобезопасным, но поскольку Point является неизменным, это не имеет значения.Кэш работает с максимальной отдачей и, естественно, имеет ограниченный размер с очень простой стратегией удаления.
В целях тестирования вы можете добавить счетчики попаданий / промахов, чтобы определить эффективность кэшей для вашего набора данных.