У меня есть основной класс, который имеет ряд связанных с экземпляром методов, которые часто необходимы в других классах, и я часто обнаруживаю, что передаю экземпляр основного класса в конструкторе. Я часто нахожу, что это несколько слоев с классами, имеющими экземпляры основного класса, которые были скопированы из экземпляра в экземпляр, который я не могу себе представить, хорошо для использования в памяти.
Есть ли способ сделать это, не передавая экземпляр в конструкторе или методе или, по крайней мере, способ уменьшить память, используемую экземплярами основного класса.
Чтобы было ясно, что я не ищу статические методы, он предназначен для того, чтобы иметь более одного экземпляра основного класса.
Пример кода:
public class Main {
public Main() {
Class2 class2 = new Class2(this);
}
public void someMethod() {
//Do something
}
}
public class Class2 {
private final Main instance;
public Class2(Main instance) {
this.instance = instance;
Class3 class3 = new Class3(instance);
}
}
public class Class3 {
private final Main instance;
public Class3(Main instance) {
this.instance = instance;
instance.someMethod();
}
}
Вы можете использовать шаблон проектирования инъекций зависимостей.
Dependency-Injection-Дизайн-шаблон
Spring, Google Guice и Java EE CDI облегчают процесс внедрения зависимостей с использованием API Java Reflection API и аннотаций java. Все, что нам нужно, это аннотировать метод поля, конструктора или сеттера и настроить их в конфигурационных файлах или классах xml.
Вы также можете использовать инъекцию зависимостей для передачи зависимых атрибутов или объектов требуемым классам. Одной из таких популярных схем является Google Guice.
Вы можете создавать методы типа someMethod() в статическом классе Main, или если это невозможно, сделайте сам класс Main одним сингл.
Пример прежнего подхода:
public class Main {
public Main() {
Class2 class2 = new Class2(this);
}
public static void someMethod() {
//Do something
}
}
Теперь вам больше не нужно передавать экземпляр Main, потому что другие классы могут просто вызвать Main.someMethod()
напрямую.