以Android中计算圆的面积为例介绍。
记得刚开始学习Android时喜欢把方法写在activity中
于是1.0版本的写法诞生了:
MainActivity.java
package com.lcl.view;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView tv;
double r;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
r = 5.0;
tv.setText("当输入半径为"+r+"\n圆面积为"+String.valueOf(s(r)));
}
public double s(double r) {
return Math.PI * r * r;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.lcl.view.MainActivity">
<TextView
android:id="@+id/tv"
android:layout_margin="20dp"
android:textColor="#ff00ff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
输出结果:
这是初学Android一般会这么做,后来随着理解的深入我们一般会采用方法提取放在activity外部类,提供方法或者接口调用,这样做的好处就是清晰条例,其实,编程是粒子化的过程。于是,2.0版本诞生了。
第一种方法 :
新建一个计算类:
MCalculate.java
public class MCalculate {
double mRadius;
public MCalculate(double r){
mRadius = r;
}
public double area(){
return Math.PI*mRadius*mRadius;
}
}
MainActivity.java
package com.lcl.view;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView tv;
double r;
MCalculate mCalculate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
r = 5.0;
mCalculate = new MCalculate(r);
tv.setText("当输入半径为"+r+"\n圆面积为"+String.valueOf(mCalculate.area()));
}
}
这种方法的好处是方法外放public属性,简介明了并且相比写在MainActivity时就显得清晰多了
我们都知道这种情况下,是可以使用接口的。
定义一个接口MInterface,
public interface MInterface {
double pai = Math.PI;
double area();
}
使用时 在activity中实现接口,不过不是很推荐,接口过多滥用也会导致乱。我们的做法是可以在外部类使用,然后activity调用外部类的方法,MCalculate.java修改为
public class MCalculate implements MInterface{
double mRadius;
public MCalculate(double r){
mRadius = r;
}
public double area(){
return pai*mRadius*mRadius;
}
}
MainActivity.java代码不变。
接口是对行为的定义和诠释,但是没有实现该方法,没有构造实现可言。
我们希望它实现上更人性化一点,我们可以优化下,加入中间调度。
新建一个内部静态类Bulider
MCalculate.java
public class MCalculate implements MInterface {
double mRadius;
public static class Builder {
private double mRadius;
public Builder(double r) {
mRadius = r;
}
public MCalculate build() {
return new MCalculate(this);
}
}
public MCalculate(Builder bulider) {
mRadius = bulider.mRadius;
}
public double area() {
return pai * mRadius * mRadius;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
TextView tv;
double r;
MCalculate mCalculate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
r = 5.0;
mCalculate = new MCalculate.Builder(r).build();
tv.setText("当输入半径为"+r+"\n圆面积为"+String.valueOf(mCalculate.area()));
}
}
这是接口和静态类结合的情况。
或者使用静态类处理,情况如下:
MCalculate.java
public class MCalculate implements MInterface {
double mRadius;
private static MCalculate mCalculate = null;
public static MCalculate getInstance() {
if (mCalculate == null) {
mCalculate = new MCalculate();
}
return mCalculate;
}
public double area() {
return pai * mRadius * mRadius;
}
}
MainActivity中调用
public class MainActivity extends AppCompatActivity {
TextView tv;
double r,s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
r = 5.0;
s = MCalculate.getInstance().area();
tv.setText("当输入半径为"+r+"\n圆面积为"+String.valueOf(s));
}
}
最后精简版
MCalculate.java
public class MCalculate {
private static MCalculate mCalculate = null;
public static MCalculate getInstance() {
if (mCalculate == null) {
mCalculate = new MCalculate();
}
return mCalculate;
}
/**
* 计算圆面积
*/
protected double getArea(double r) {
return Math.PI * r * r;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
TextView tv;
double r,s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
r = 5.0;
s = MCalculate.getInstance().getArea(r);
tv.setText("当输入半径为"+r+"\n圆面积为"+String.valueOf(s));
}
}
在类中使用静态方法如果new过不会重复new 所以MainActivity中不用new了。究竟使用哪种方式处理取决于你所需要的环境和要求。
接口是供某种行为后期实现和扩展服务的,而静态类内部不允许非静态方法出现,所以没有办法把接口放到静态类内部。避免乱调用最好使用本来内部才能调用声明。