扩展时如何更改超类成员变量

时间:2014-09-30 05:52:10

标签: java oop inheritance

我有一个超级课程:

public abstract class BasicDAO implements DAO{
    private static final Logger log = LoggerFactory.getLogger(BasicDAO.class);
    protected DBCollection Collection;
    @Override
    public DBCursor findByAll() {
        DBCursor cursor = Collection.find();
        log.debug("do something");
        return cursor;
    }
}

我扩展了这个超类:

public class TopicBasicDAO extends BasicDAO{
    private static final Logger log = LoggerFactory.getLogger(TopicBasicDAO.class);
}

我想将成员变量日志更改为子类,但它不能覆盖该成员。我该怎么办?

2 个答案:

答案 0 :(得分:1)

如评论所示,您无法覆盖静态成员。我建议一个替代方案。您的层次结构中的每个类似乎都需要不同的记录器实例。这可以使用Map来处理。

private static Map<Class,Logger> loggers = new HashMap<Class,Logger>();
....
public Logger getLogger ()
{
    Logger logger = null;
    if (BasicDAO.loggers.containsKey(this.getClass())) {
        logger = BasicDAO.loggers.get(this.getClass());
    } else {
        logger = LoggerFactory.getLogger(this.getClass());
        BasicDAO.loggers.put (this.getClass(), logger);
    }
    return logger;
}

然后,您不是直接访问记录器,而是编写getLogger().debug("do something");

答案 1 :(得分:0)

使日志变量受保护而不是超类中的final,然后在您的子类中可以修改它, 即在超类中:

protected static Logger log = LoggerFactory.getLogger(BasicDAO.class);

并在子类中:

public class TopicBasicDAO extends BasicDAO{
    log = LoggerFactory.getLogger(TopicBasicDAO.class);
}