创建线程宽/类宽对象的概念

时间:2018-09-05 14:56:42

标签: java conceptual

我正在搜索概念以将对象转发到子对象。

示例: 我想为包括子对象在内的几个主要对象创建日志文件(想象一个REST服务器,它将按ID记录每个连接)。

创建一个大日志文件很简单(重定向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可以写到文件中。)

现在,我正在考虑为每个App创建一个Debug输出目标的解决方案。我绝对可以将调试更改为非静态,然后在Application中创建调试对象。<​​/ p>

但是有什么方法可以在子类中使用该对象,而无需通过构造函数或setter函数转发调试对象,这意味着必须为每个类添加调试器对象?

最美丽的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

请注意,此解决方案可能会大大降低性能,这是非常肮脏的方式,但是某些记录器会包含此类数据。

但是您可以使用Thread.currentThread().getStackTrace()来获取堆栈跟踪信息,并从错误处获取类和方法。

如果您使用的是Java9 +,则可能应该改用StackWalker API,尤其是它具有漂亮的过滤器和其他有用的功能。 这样一来,您就可以根据堆栈上的类/方法名称来猜测应用了。