Java记录与抽象类

shu*_*iar 52 java inheritance logging abstract-class

我正在开发一个项目,目前正在使用log4j实现一些日志记录,我很好奇我应该如何实现日志.我正在讨论的两个实现如下:

第一选择

对于该类和所有子类,使用来自超类的单个日志:

public abstract class AbstractFoo {
    protected static Log LOG = LogFactory.getLog(AbstractFoo.class);

    ...
}

public class Foo extends AbstractFoo {
    public void someMethod() {
        LOG.info("Using abstract log");
    }
}
Run Code Online (Sandbox Code Playgroud)

第二选择

为每个类,super和subs使用单独的日志:

public abstract class AbstractFoo {
    private static Log LOG = LogFactory.getLog(AbstractFoo.class);

    ...
}

public class Foo extends AbstractFoo {
    private static Log LOG = LogFactory.getLog(Foo.class);        

    public void someMethod() {
        LOG.info("Using own log");
    }
}
Run Code Online (Sandbox Code Playgroud)

什么更有意义,为什么?

Pet*_*rey 91

我也不愿意.相反,我会在两种情况下都使用正确的类.

public abstract class AbstractFoo {
    protected final Log log = LogFactory.getLog(getClass());

    ...
}

public class Foo extends AbstractFoo {
    public void someMethod() {
        log.info("Using abstract log");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你没有进行大量的日志记录(无论如何这是一个好主意),你可以使用一种方法.

public abstract class AbstractFoo {
    protected Log log() { return LogFactory.getLog(getClass()); }

    ...
}
Run Code Online (Sandbox Code Playgroud)

如果有一个类调用了很多,你可以覆盖它以给你一个缓存的实例.

  • 如果静态记录器对于所有实例都相同,则它们会更好.在抽象类的情况下,实例的类并不完全相同. (7认同)

n1c*_*r4m 12

这是我的解决方案(最终静态记录器):

public abstract class AbstractFoo {
     protected abstract Log getLogger();
     public doSomething() {
          getLogger().info("log something");
     }
}

public class Foo extends AbstractFoo {
    private static final Log log = Log.getLogger(Foo.class);

    protected Log getLogger() {
         return log;
    }
    public doSomethingElse() {
          log.info("log somethingElse");
    }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*exR 5

两者都有道理。这取决于您的应用程序。

我认为,更常用的做法是为每个班级使用私人记录器。这使您可以配置每个类和每个程序包的日志记录。请记住,AbstractFooFoo可能属于不同的包,可能你想看到的日志Foo只。

此外,如果您想编写protected字段,请三思而后行。这不是完全禁止的,而是众所周知的坏习惯。它使您的代码可读性较差,难以维护。