Как я могу узнать, когда создается экземпляр? - PullRequest
0 голосов
/ 29 июня 2019

Итак, я сделал простую программу, которая позволяет создавать экземпляры из множества классов. Теперь я отвечаю за отправку созданных экземпляров на сервер. Мне действительно нравятся конструкторы классов, поэтому я действительно не хотел их изменять. Как я мог слушать эту программу, чтобы знать, какие классы были недавно созданы, я думал об использовании отражения и, возможно, потоков?

Вот краткий пример того, чего я хочу достичь:

public class MainApplicaton{

     public static void main(String []args){
        ConnectServer.listenToCreatedInstances().
        new Vase();
        new Dog();
        new House();
     }
}

package stuff.components;
public class Human{
    public Human(){

    }
}

package stuff.components;
public class Dog{
    public Dog(){

    }
}

package stuff.components;
public class House{
    public House(){

    }
}

Теперь моя ветка слушателя:

   public enum ConnectServer {
        Server;

        public void listenTocreatedIntances(){
            //Something happens here
            Class c ..
            System.out.println("A instance of "+c.getName());
        }
    }

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Относительно простым способом достижения этого является введение общего родительского класса и использование конструктора родительского класса для генерации событий.Конструкторы подкласса всегда вызывают конструктор родительского класса.

package stuff.components;
class Component {
    public Component() {
        ConnectServer.Server.onInstanceCreated(this.getClass());
    }
}

class Human extends Component {
    public Human(){
        // implicit call to Component constructor
    }
}

class Dog extends Component{
    public Dog(){
        // implicit call to Component constructor    
    }
}

Если вы хотите получать события от создания экземпляра без каких-либо изменений кода, вам придется смотреть дальше, чем Java.Возможны следующие варианты:

  • аспектно-ориентированное программирование, например aspectj: оно позволяет вводить код, когда в программе происходят определенные вещи (например, вызовы конструктора)
  • вводить код в подклассконструкторы во время выполнения с использованием библиотеки манипулирования байт-кодом, такой как ASM
0 голосов
/ 02 июля 2019

Еще один способ ответить на этот вопрос - использовать FactoryPattern. Каждый раз, когда мы регистрируем объект, мы уведомляем синглтон.

public class MainApplicaton{

     public static void main(String []args){
        Vase vase = new Vase();
        Dog dog = new Dog();
        House house = new House();
        ConnectServer.listenToCreatedInstances(vase);
        ConnectServer.listenToCreatedInstances(dog);
        ConnectServer.listenToCreatedInstances(house);
     }
}

В этом синглтоне мы получили бы созданный элемент и применили желаемое поведение.

public enum ConnectServer {
        Server;

        public void listenTocreatedIntances(Component component){
            //Something happens here
            System.out.println("A instance of "+component.getClass().getName());
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...