在尊重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的更多内容)。

注释,自省和代码生成提供了极大的灵活性和功能。因此,如果完全使用它们,请明智地使用。对于这种特殊情况,“动态方法”更具可读性。

09-28 07:39