在尊重Dont-Repeat-Yourself的同时,如何设置包含类名称的变量(如TAG
中的android.util.Log
)?
这些是一些可能性:
在Google代码中,它通常像
public class Classname {
public final String TAG = "Classname";
它重复了类名,并且在AndroidStudio中没有正确地重命名(没有
String
)。然后,有一个动态变体
public class Classname {
public final String TAG = getClass().getName();
它不重复Classname,因此看起来更好,但可读性较差。
或者,您可以使TAG
static
(这可能是过早的优化)。除了上面的正式版本,您还可以通过以下代码获得名称:public class Classname {
public final static String TAG
= new Object() { }.getClass().getEnclosingClass().getName();
可读性差,并且在继承方面确实存在问题(静态)。
关于此的最佳实践是什么?
有没有比1-3更好的方法? (或者这是错误的方法?)
最佳答案
我过去使用动态方法:
public class Classname {
public final String TAG = getClass().getName();
它不是那么难以理解,并且是独立的。
对于更复杂的DRY-ness案例,总有可能创建您自己的注释,然后
使用两步编译过程,首先生成非DRY源,然后将其编译为非DRY .class文件。
在运行依赖于这些部件的任何逻辑之前,请在程序的初始化步骤中使用注释在运行时填充非DRY部件。
使用第二种方法,您可能会遇到类似
@ReplaceWithClassName("TAG")
public class Classname {
public final String TAG;
然后,您将遍历所有带
@ReplaceWithClassName
注释的类,并将其作为初始化步骤(更多有关遍历带注释的类here;有关更改最终String here的更多内容)。注释,自省和代码生成提供了极大的灵活性和功能。因此,如果完全使用它们,请明智地使用。对于这种特殊情况,“动态方法”更具可读性。