【问题标题】:Java "self" (static) referenceJava“自我”(静态)参考
【发布时间】:2011-07-13 08:43:09
【问题描述】:

我正在以静态上下文方式(如PHP Scope Resolution Operator)寻找对 JAVA 中当前类的“自我”引用?

解决方案:超出范围?请注意,这与静态定义相比真的慢(300 倍):

static Logger LOG = LoggerFactory.getLogger(new RuntimeException().getStackTrace()[0].getClassName());

老式的方法是:

static Logger LOG = LoggerFactory.getLogger(<Classname>.class.getName());

还有其他选择吗?我正在寻找一种将记录器定义放入抽象类的方法。记录器应自行确定调用它的类。

【问题讨论】:

    标签: java static scope self


    【解决方案1】:

    您不需要使用任何这些。我觉得使用方便的是:
    //记录器

    private static final Logger logger = LoggerFactory.getLogger(CreateEmployeeRecord.class or this.class);

    在每个需要记录的类中执行此操作,并将括号中的类名更改为相应的类。

    【讨论】:

      【解决方案2】:

      我认为没有任何替代方案与您的问题中的两者有显着不同。

      你可以像这样创建一个辅助方法:

      public static String getCallingClassname() {
          return new RuntimeException().getStackTrace()[1].getClassName();
      }
      

      然后

      static Logger LOG = LoggerFactory.getLogger(Helper.getCallingClassname());
      

      但这与原始版本一样昂贵。 (FWIW - 慢 300 倍可能不是主要问题,除非您有数千个这样的记录器。这些静态中的每一个都只初始化一次......)

      我个人偏爱“老式”的做法。

      【讨论】:

        【解决方案3】:

        稍微快一点

        static final Logger LOG = LoggerFactory.getLogger(
               Thread.currentThread().getStackTrace()[0].getClassName());
        

        如果你这样做 1000 次,使用 Class.class.getName() 将需要 36 毫秒,而这样做需要 60 毫秒。也许它不值得担心太多。 ;)

        【讨论】:

          【解决方案4】:

          你不应该继承记录器。只需在每个类中声明记录器。

          但是如果你不想做这样有用的思考,就不要让它静态)

          【讨论】:

            猜你喜欢
            • 2016-01-21
            • 1970-01-01
            • 1970-01-01
            • 2013-11-14
            • 1970-01-01
            • 1970-01-01
            • 2017-02-13
            • 2021-12-14
            • 1970-01-01
            相关资源
            最近更新 更多