我希望所有Java类都有一个logger
变量:
private static final Logger logger = Logger.getLogger(Foo.class);
但我必须在所有类中键入此行。
有没有办法实现自动化?注释可以帮助我吗?
答案 0 :(得分:6)
我猜你真正想要的不是继承。事实上,继承是一种结合记录器恕我直言的相当糟糕的方式,因为记录器不是真正的类的功能,而是应用程序的cross-cutting concern。
您需要的是一个改进的新类模板。如果您使用的是eclipse,可以在 Java->代码样式 - >代码模板下的偏好设置中找到它,然后切换到对话框的右侧并选择代码 - >新Java文件
在intellij idea中,您可以在文件 - >设置 - &gt;文件模板 - &gt;类< STRONG>
已接受的this question答案表明将log4j日志记录合并到模板中,并使用import语句。
答案 1 :(得分:5)
如果您想继续使用继承方式,即恕我直言并不是很好,您可以从一个抽象基类继承,其中声明了受保护的非静态Logger:
protected final Logger log = Logger.getLogger(getClass().getName());
这样记录器的类将是实现类。但是当然Java的问题只允许单一继承,当你需要扩展另一个类时可能会让你遇到麻烦。
我个人而言,我正在使用AOP(面向方面编程)进行日志记录,但它并不总是一种解决方案。
答案 2 :(得分:3)
有没有办法实现自动化?
当然不是普通的Java。
继承不会解决此问题...如果您想要一个static
和/或private
的字段。最接近的是将类似的方法添加到基类:
protected final Logger getLogger() {
return Logger.getLogger(this.getClass());
}
这将是相当昂贵的。
或者,您可以向基类添加非私有的非静态字段; e.g
protected final Logger log = Logger.getLogger(this.getClass());
或者您可以让您的IDE或某些源代码处理器/生成器在每个类的源代码中添加static private Logger
字段。
注释可以帮助我吗?
我不这么认为。你可能能够使用AOP注入一个字段,但我不认为你的代码能够引用它。
答案 3 :(得分:3)
如果您正在使用Eclipse,请为Java类创建一个新的代码模板。这将在每个新类中添加记录器引用,包括适当的导入。如果你不是在谈论log4j,请调整导入。
然后
答案 4 :(得分:0)
使用继承
继承可能会帮助你
答案 5 :(得分:0)
那么, 您可以做的是创建一个拥有此记录器变量的抽象父类,并且每个类都继承自此类。 但是在java中只允许一个继承,你可能会遇到麻烦,因为你的父类阻止了继承。
第二个问题是:记录器将始终使用抽象父类的类进行初始化。如果这不打扰你......
答案 6 :(得分:0)
学习依赖注入,使用Seam(包括Weld),Spring或Guice等框架,然后使用面向方面编程( AOP )自动记录所有被调用的方法(以及可选的方法花费多长时间。)
在某些情况下,您仍然需要定义Logger
并在某些方法中进行一些日志记录,但AOP方法仍然会删除许多违反DRY的样板代码(不要重复自己原则。
答案 7 :(得分:0)
一个非常原始的解决方案是创建一个抽象类,其中包含要添加到所有类的attritbute。
但是,由于java不支持多重继承,因此如果您需要从其他类继承,则此解决方案不适用。
据我所知,注释不是为了提供这样的功能而设计的。
答案 8 :(得分:0)
不要做这些,这是过度工程。只需在需要记录的每个类中放置一个单独的记录器并完成它。
作为一个小的黑客,你可以省略'私人'(使记录器包受到保护),以避免当目前没有使用你的记录器的代码行时令人讨厌的Eclipse'未使用'警告,而不必添加SuppressWarnings注释
答案 9 :(得分:-3)
您的类应该从公共基类继承它。
我不是Java大师,但应该是可能的
public class Vehicle
{
protected Logger logger = Logger.getLogger(this.getClass());
}
public class Car extends Vehicle
{
}
这就是如何在C#中完成的 - 自从我上次使用Java以来已经很久了。