Да, вы можете реализовать шаблон Flyweight с помощью Hibernate.
Шаблон flyweight - это способ минимизировать использование памяти на экземпляр . Стратегия заключается в том, чтобы делить как можно больше состояний между экземплярами в полулегком весе. В вашем случае разделяемым состоянием является все, кроме идентификатора объекта гибернации и некоторого дополнительного состояния для сохранения идентичности объекта .
Каждый экземпляр flyweight нуждается в собственной идентификации объекта . Дополнительное состояние - это способ реализации идентификатора для различения объектов, имеющих общее состояние.
public boolean equals(Object obj){
Fly other; [..]//check type
//null checks ommitted
return other.myState.equals(myState) && other.commonState.equals(commonState);
}
Если идентификатор объекта является общим для экземпляров, hibernate интерпретирует все физические экземпляры (ссылки) как один и тот же экземпляр. Hibernate использует метод equals для проверки идентичности объекта, и ваша равная реализация должна будет возвращать (! a.equals(a) == true)
, что недопустимо. Равен должен быть рефлексивным. Если вы нарушите этот контракт, все библиотеки, которые зависят от контракта, будут нарушены (коллекции, спящий режим и т. Д.).
Вы не можете реализовать метод равных, используя идентификатор объекта гибернации , чтобы различать объекты. Это сделало бы идентичность объекта зависимой от постоянного состояния (постоянное или временное).
Одним из способов моделирования общего состояния в режиме гибернации является связь один-ко-многим между объектами общего состояния и объектами типа flyweight. (Может быть, у кого-то есть идея, как отобразить данные без объединения двух таблиц?)
String: только интернализованные строки будут предоставлены для общего доступа. Это не лучшее решение в большинстве случаев. Подходит для символов (имя класса, имя метода и т. Д.).
Внутренние строки никогда не будут собираться мусором, и вы должны иметь экземпляр String, который все равно будет собираться мусором new String("..").intern()
. Это не сохранит ассигнования. Есть только незначительное преимущество в том, что базовая строка не выдержит генерацию gc или может быть выделена в стеке (с включенным и применимым анализом escape в горячей точке).