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

时间:2016-12-26 21:37:02

标签: java android static dialog

我的几乎所有课程都有这种方法。

max-height

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

//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);
        }
    });
}

我得到lint警告"静态成员被实例引用"访问。我不知道如何不使用"这个"这里。所以我有两个选择。

1)忽略棉绒警告

2)放弃"静电"在我的助手方法中。

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

4 个答案:

答案 0 :(得分:12)

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

解决方案是替换

materialHelper.showInfoDialog(...)
使用

在代码中的任何地方

MaterialHelper.showInfoDialog(...)

答案 1 :(得分:4)

  

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

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

答案 2 :(得分:2)

E.g。 ,假设

    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);

答案 3 :(得分:0)

用于:

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