如何强制所有Java类具有属性

时间:2011-04-08 06:44:44

标签: java annotations

我希望所有Java类都有一个logger变量:

private static final Logger logger = Logger.getLogger(Foo.class);

但我必须在所有类中键入此行。

有没有办法实现自动化?注释可以帮助我吗?

10 个答案:

答案 0 :(得分:6)

我猜你真正想要的不是继承。事实上,继承是一种结合记录器恕我直言的相当糟糕的方式,因为记录器不是真正的类的功能,而是应用程序的cross-cutting concern

您需要的是一个改进的新类模板。如果您使用的是eclipse,可以在 Java->代码样式 - >代码模板下的偏好设置中找到它,然后切换到对话框的右侧并选择代码 - >新Java文件

在intellij idea中,您可以在文件 - >设置 - >文件模板 - >类

已接受的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,请调整导入。

enter image description here

然后

enter image description here

答案 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以来​​已经很久了。