Концепция создания потокового / классового объекта - PullRequest
0 голосов
/ 05 сентября 2018

Я ищу концепт для пересылки объекта подобъектам.

Пример: Я хотел бы создать файлы журналов для нескольких основных объектов, которые включают подобъекты (представьте себе сервер REST, который бы регистрировал каждое отдельное соединение по идентификатору).

Создать один большой лог-файл просто (перенаправить System.out.println, я это уже инкапсулировал) Пример кода:

    class SubElementA{
    public SubElementA(){
        Debugger.debug("I am called, too");
    }

}

Application.java

package com.dev4ag;

class Application{
private ElementA elA;
private String prefix;
public Application(String name){
    this.elA = new ElementA();
    this.prefix = name;
}

public void countUp(){
    Debugger.debug(this.prefix+": I will now count up");
    this.elA.doSomeStuff();
}

}

ElementA.java

package com.dev4ag;

class ElementA{
    private int counter;
    private SubElementA subElementA;
    public void doSomeStuff(){
        counter++;
        Debugger.debug("Counter is: "+counter);
    }

    //Constructor
    public ElementA(){
        subElementA = new SubElementA();
        this.counter = 0;
    };
}

SubElementA.java

package com.dev4ag;

class SubElementA{
    public SubElementA(){
        Debugger.debug("I am called, too");
    }

}

Debugger.java

package com.dev4ag;
public class Debugger {
    public static void debug(String output){
        //Just imagine we would write to a file here ;)
        System.out.println(output);
    }
}

(было проще написать system.out.println, чем создать файл, просто представьте, что Debugger.debug будет писать в файл).

Теперь я думаю о решении создать одну цель вывода отладки для каждого приложения. Я определенно могу изменить отладку, чтобы она не была статичной, и создать объект отладки в приложении.

Но есть ли способ использовать этот объект в подклассах, не перенаправляя объект отладки ни через конструктор, ни через функцию сеттера, что будет означать необходимость добавления объекта для отладчика в каждый класс?

Что было бы самым красивым решением для этого?

1 Ответ

0 голосов
/ 05 сентября 2018

Обратите внимание, что это решение может сильно снизить производительность, и это довольно грязный способ, но некоторые регистраторы включают такие данные.

Но вы можете использовать Thread.currentThread().getStackTrace(), чтобы получить трассировку стека, как по ошибке, и получить класс и метод, из которого был вызван ваш метод.

Если вы используете java9 +, то вам, вероятно, следует вместо этого использовать StackWalker API, особенно если он имеет хорошие фильтры и другие полезные функции. Тогда вы можете угадать приложение по именам классов / методов в стеке.

...