Я перерабатываю класс под названием ConfigNode
, который хранит 50 «свойств». Каждое свойство является собственным объектом. Все свойства являются необязательными, и большую часть времени многие из них не установлены.Менее подробный способ сделать ленивую загрузку
В настоящее время класс написан таким образом, что при его создании создается все 50 свойств. Когда вы создаете миллион объектов Config
, Java говорит мне, что я использую 2,5 гигабайта памяти. Когда я комментирую экземпляр свойств, Java говорит, что я использую 300 МБ.
Эталон код я использую
Runtime.getRuntime().gc();
// do my stuff
Runtime.getRuntime().gc();
long memory = Runtime.getRuntime().totalMemory();
System.out.println("Memory used: " + memory/1000000 + " MB");
Так что я имею в виду переписывать класс для ленивой нагрузки свойство, когда он доступен, но, чтобы писать что-то вроде
// This is probably not thread safe, so it could be even more verbose
public NodeProperty propOne() {
if (propOne == null) {
propOne = new NodeProperty(...)
}
return propOne
}
И тогда сделать это для всех свойств, кажется, довольно многословным. Есть ли что-нибудь в Java, которое может помочь мне уменьшить количество кода, который я должен написать (и, следовательно, поддерживать)?
Вот как NodeConfig выглядит
public class NodeConfig {
public NodeProperty pVersion = new NodeProperty("Spec Version", Status.REQUIRED, Visibility.HIDDEN);
public NodeProperty pTwoWay = new NodeProperty("Two way", Status.OPTIONAL, Visibility.VISIBLE);
public NodeProperty pBinary = new NodeProperty("Binary mode", Status.OPTIONAL, Visibility.HIDDEN);
// more properties
public NodeConfig() {
//
}
}
«все 50 свойства также созданный экземпляр ». Могли бы вы изменить этот конструктор так, чтобы вместо создания объектов, которые вы просто сохраняете null, если свойство не существует или не должно использоваться? –
'totalMemory()' возможно, не делает то, что вы думаете, это «общий объем памяти, доступный в настоящее время для текущих ** и будущих ** объектов, измеренных в байтах». (http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#totalMemory()) – berry120
Только идея у меня есть, может быть, что-то с отражением. Попробуйте написать один метод для всех 50 вызовов. Кроме этого, попробуйте рефакторинг вашего объекта. Если есть много свойств, которые он не использует, это признак того, что у него слишком много состояний, слишком большая ответственность. –