繁体   English   中英

通过实例引用访问静态成员的最佳解决方案

[英]Best solution for static member being accessed by instance reference

我几乎在所有班级都有这种方法。

//listener - info
private void clickInfoListener(final ImageView iv, final int title, final int text){
    iv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            materialHelper.showInfoDialog(MainActivity.this, iv, title, text);
        }
    });
}

在辅助类中访问此静态方法

public static void showInfoDialog(Context context, final ImageView iv, final int title, final int text){
    iv.setImageResource(R.drawable.ic_info_touched);
    //
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setCancelable(true);
    builder.setTitle(title);
    builder.setMessage(text);
    builder.setPositiveButton(R.string.gotIt, null);
    builder.show();
    //
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {
            iv.setImageResource(R.drawable.ic_info_primary);
        }
    }, 25);
}

我得到了“静态成员被实例引用访问”的lint警告。 我不知道怎么不在这里使用“这个”。 所以我有两个选择。

1)忽略棉绒警告

2)在我的帮助方法中删除“静态”。

哪个更好? 或者提出第三种解决方案。

警告是说您通过实例materialHelper而不是通过类MaterialHelper本身调用静态方法showInfoDialog 这是“坏”,因为它表明该方法实际上是一个依赖于实例中某个状态的实例方法。

解决方案是更换

materialHelper.showInfoDialog(...)

你的代码中到处都是

MaterialHelper.showInfoDialog(...)

或者提出第三种解决方案。

materialHelper替换为showInfoDialog()所在的类名。 根据您的描述, materialHelper是此类的一个实例。

例如,假设

    public static YourClass {
//.. the other code
    private void clickInfoListener(final ImageView iv, final int title, final int text){
        iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                materialHelper.showInfoDialog(MainActivity.this, iv, title, text);
            }
        });
    }

    public static void showInfoDialog(Context context, final ImageView iv, final int title, final int text){
        iv.setImageResource(R.drawable.ic_info_touched);
        //
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setCancelable(true);
        builder.setTitle(title);
        builder.setMessage(text);
        builder.setPositiveButton(R.string.gotIt, null);
        builder.show();
        //
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            public void run() {
                iv.setImageResource(R.drawable.ic_info_primary);
            }
        }, 25);
    }
    }


//somewhere
YourClass materialHelper = new YourClass();

所以。

这个方法showInfoDialog(MainActivity.this, iv, title, text); 是'静态方法'

这意味着:此方法是为此类的所有实例共享的(静态变量也是如此)。 调用它的位置并不重要。 这就是为什么lint说:“哦天哪,你为什么要用这个实例调用这个静态方法呢?它可能会改变其他实例中的共享值!小心!”。 Java会理解你的代码,但这是一个小错误(你的误解)。 这就是为什么正确的解决方案是使用这个:

YourClass.showInfoDialog(MainActivity.this, iv, title, text);

用于:

import static com.yourcompany.yourproject.materialHelper.showInfoDialog;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM