【问题标题】:Accessing implementing class in a static context在静态上下文中访问实现类
【发布时间】:2014-08-01 13:41:45
【问题描述】:

是否可以在静态上下文中确定实现类的类。鉴于我想在超类中创建一个记录器,该记录器将其消息记录在实现类的类名下。

目前我正在尝试使用这种方法:

public abstract class GenericDao<T, ID extends Serializable>
{
    protected static Logger logger = Logger.getLogger(new Object() { }.getClass().getEnclosingClass());

    ...
}

但我仍然得到超类。有什么办法可以做到这一点,或者当我可以访问“this”时,我应该放弃并将该类包含在实际的日志记录方法中。

【问题讨论】:

  • 不是答案,而是另一种选择:让您的记录器保持私有(这确实需要您为每个实现类重新声明它们)。
  • 即使静态变量可以属于 GenericDao。子类型不会有自己的副本。

标签: java class inheritance static


【解决方案1】:

静态变量和方法始终属于声明类,在这种情况下为GenericDao。如果您创建一个新的子类SpecificDao,那么它不会访问记录器的新副本,如果它访问它,它访问的记录器与GenericDao 中的记录器完全相同。

您需要将 Logger 创建为非静态成员,并且每个对象都有一个(可能效率很低),或者在每个类中声明记录器。

如果您在GenericDao 中有一个抽象方法getLogger() 并且根本没有Logger,那么应该可以为您提供您想要的东西......

每当它想记录GenericDao 时调用getLogger().log

实现类然后定义自己的私有静态 Logger 记录器。它们覆盖 getLogger() 抽象方法并从中返回静态方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2011-11-03
    • 2021-02-22
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多