扩展

2014-09-30 107 views
2

时如何改变超类的成员变量我有一个supperclass:扩展

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); 
} 

我想改变成员变量日志子类,但它可以”不要超越会员,我该怎么办?

+4

不能覆盖'static'成员。他们属于班级,而不是对象 – Adi 2014-09-30 05:54:43

+0

@Adi我知道,但我想在扩展时使用子类的supperclass方法中的日志。我认为Eran的回答非常好。 – v11 2014-09-30 08:24:53

回答

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");

0

让日志变量保护,在超不是终点,然后在子类中,你可以修改它, 即超类:

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

,并在子类:

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

这是一个很好的做法,将Logger声明为private static final – Yasin 2014-09-30 06:38:45

+0

这段代码甚至不会编译,除非将它放在静态初始化块中。 – Eran 2014-09-30 06:48:35