android - 在接口中调用方法导致空指针异常
问题描述
出于解耦原因,我想调用由类 Foo 实现的接口,但该接口始终返回 null。这是一个过于简单的例子,只是为了展示我在做什么。在实际项目中,有一个演示者类,它在其构造函数中采用计算接口,然后使用匕首 2 调用方法来更新我的主要活动中的视图。我无法在演示者类或主要活动亲属中初始化接口这个例子。我知道这是可行的,但我不确定如何。
//Interface that has a couple abstract methods
public Interface Computation{
public double add(double somenumber, double anothernumber);
public int multiply(int somenumber, int somenumber);
}
public class Foo implements Computation{
@Override
public double add(double somenumber, double anothernumber){
return somenumber + anothernumber;
};
@Override
public int multiply(int somenumber, int anothernumber){
return somenumber * anothernumber;
};
}
//main class
public class MainClass extends Activity{
private TextView tv;
Computation mComputation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findviewById(R.id.textview);
tv.setText(mComputation.multiply(4, 9))//here mComputation is null always
}
}
解决方案
ANullPointerException
发生是因为Computation
尚未实例化,因此它仍然为空。
接口,如果您将它们用作像您在这里所做的那样的对象,则必须实例化,因为您将其视为对象。
有几个解决方案给你:
1)您可以简单地使用您创建Computation
的Foo
对象进行实例化。
public class MainClass extends Activity{
private TextView tv;
Computation mComputation = new Foo();
...
}
这会起作用,因为您正在通过使用它的默认构造函数来Computation
实例化 。Foo
2)对于您想到的方法,您可以简单地使用静态方法。这避免了创建接口实例的需要。
public interface Computation{
public static double add(double somenumber, double anothernumber){
return somenumber + anothernumber;
}
public static int multiply(int somenumber, int anothernumber){
return somenumber * anothernumber;
}
}
然后在您的 MainActivity 中像这样使用它:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findviewById(R.id.textview);
tv.setText(Computation.multiply(4, 9))
}
您不需要Computation mComputation = new Foo();
使用此解决方案的对象。
3)您实际上可以只使用默认接口方法而无需创建Foo
.
public interface Computation{
default double add(double somenumber, double anothernumber){
return somenumber + anothernumber;
}
default int multiply(int somenumber, int anothernumber){
return somenumber * anothernumber;
}
}
然后在您的 MainActivity 中:
public class MainClass extends Activity implements Computation{
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findviewById(R.id.textview);
tv.setText(multiply(4, 9))
}
}
有了这个方案,你只需要实现Computation
接口,并且可以简单的调用multiply()
和add()
方法。如果您的方法足够简单并且方法的功能对于每个实现都是相同的,那么使用默认方法有助于减少相当多的代码。