我读到一个人不应该使用像
这样的TAGprivate static final String TAG = ThisClassName.class.getSimpleName();
但是
private static final String TAG = "MCLSN";
因为ProGaurd将创建错误和/或无法正确混淆代码。这些是正当理由吗?
参考文献:
http://www.drewhannay.com/2016/02/android-logcat-tag-best-practices.html https://blog.mindorks.com/applying-proguard-in-an-android-application
答案 0 :(得分:3)
老实说,这是一个优先事项,但是我更喜欢简单的String选项。
使用mock()
选项的唯一好处是因为它支持重构。因此,只有在更改类的名称(这种情况很少发生)或复制/粘贴文件以用作模板时,它才有用。
因此,如果您经常这样做,我会明白为什么您会偏爱第一种选择。它只是使不必手动更改TAG变得更加容易。
我最初还使用getSimpleName()
作为TAG,直到最近遇到一个小问题。
使用MVVM体系结构时,每个视图实际上只有一个ViewModel,因此我创建了一个ViewModelFactory,该ViewModelFactory为该视图创建并返回正确的ViewModel。由于它是唯一的,因此我决定将TAG用作我所需的ViewModel的标识符。
因此,通过在TAG上使用简单的Switch-case语句,我应该能够获得正确的ViewModel。但是,使用getSimpleName()
时,根本不能将TAG用作大小写表达式。我收到错误:getSimpleName()
。
因此,如果您仅打算在某些情况下使用TAG(例如Logcat),则只需使用Constant Expression Required
就可以了。但是,如果您打算将它们用作特定类组的唯一类标识符,则需要使用纯String选项。
答案 1 :(得分:2)
这肯定是一个问题。我正在使用当前使用getSimpleName()
作为TAG的代码,并且如上所述,使用proguard可以将这些代码从“ FragmentA”混淆为“ a”。
如果使用这些标签进行识别,则很容易以这种方式引入错误,因为可能会有多个名称混淆为“ a”。
我们还有一个额外的问题,因为这些混淆的TAG用于数据库ID和字段。因此,解决此问题将破坏客户的数据库行为。
坏东西,如果可能的话,最好尽早避免。