【问题标题】:Alternatives to macro substitution in javajava中宏替换的替代方法
【发布时间】:2011-02-09 17:50:30
【问题描述】:

我有一个日志语句,我总是使用this.getClass().getSimpleName()作为第一个参数。 我想把它放在某种宏常量中,并在我的所有日​​志语句中使用它。 但我了解到,Java 没有像 C++ 那样简单的机制。

在 Java 中实现此类功能的最佳方法是什么?

我的示例日志语句(来自 Android)如下..

Log.v(this.getClass().getSimpleName(),"Starting LocIden service...");

【问题讨论】:

  • 您是否出于调试目的创建这些语句?如果是这样,调试器工具是否无法帮助您避免日志?

标签: java macros constants


【解决方案1】:

Java 没有宏,但您可以使代码更短:

Log.v(this, "Starting LocIden service...");

Log 类中:

public void v(Object object, String s)
{
    _v(object.getClass().getSimpleName(), s);
}

另一种方法是检查调用堆栈。

【讨论】:

  • 谢谢马克。那更干净:-)
【解决方案2】:

Karthik,大多数日志工具都允许您指定输出的格式,其中一个参数是类名,它使用 Mark 提到的方法(堆栈检查)

例如,在 log4j 中,参数是 %C 来引用类名。

【讨论】:

  • 感谢您回复 Augusto。我正在使用 Android SDK 的“日志”实用程序进行日志记录。它似乎没有直接可用的特定功能。
【解决方案3】:

另一种方法是遵循 android 对其日志记录功能的建议。

Log.v(TAG, "Message");

其中TAG 是您班级中的私有静态最终字符串。

【讨论】:

  • 这是我最初的方法,但我认为我可以直接使用类名,然后弹出这个问题:)
  • 我更喜欢静态的最终字符串方法。这样,如果您希望它是类名以外的其他名称,则可以非常轻松地对其进行更改。
  • 我也是,但我只是想知道是否确实有一种方法可以在这里实现宏替换之类的东西。这样我就可以在我的所有类中使用通用调用。
【解决方案4】:

使用适当的日志框架(例如 slf4j)。每个记录日志的类都有自己的记录器,因此无需将类名传递给日志方法调用。

Logger logger = LoggerFactory.getLogger(this.getClass());

logger.debug("Starting service");
//...
logger.debug("Service started");

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 2012-09-19
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    相关资源
    最近更新 更多