[英]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.