下面通过一个实例来介绍如何使用 static 块来优化代码。该代码冗余部分用绿色标出,该函数被调用四次。
public static final String MOOD_IMAGE_KEY_PRE = "pref_camera_water_mark_mood_image_key_";
public static final String MOOD_IMAGE_KEY_PRE_EX = "pref_camera_water_mark_mood_image_key_ex_";
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
if (position >= mImageIds.length) return;
ComboPreferences pref = new ComboPreferences(WaterMarkMoodImageActivity.this);
pref.setLocalId(WaterMarkMoodImageActivity.this,
WaterMarkMoodImageActivity.this.getIntent().getIntExtra("camera-id", 0));
Editor editor = pref.edit();
if (Util.IsExport()) {
editor.putString(WaterMarkManager.MOOD_IMAGE_KEY_PRE_EX+""+mSelectedIndex, ""+position);
} else {
editor.putString(WaterMarkManager.MOOD_IMAGE_KEY_PRE+""+mSelectedIndex, ""+position);
}
editor.apply();
WaterMarkMoodImageActivity.this.finish();
}
private int getImageBackgroundIdFromPreference(int position) {
IconListPreference imagePreference = null;
if(Util.IsExport()) {
imagePreference = (IconListPreference) ((PhotoModule)mPhotoModule).getPreferenceGroup()
.findPreference(MOOD_IMAGE_KEY_PRE_EX+""+position);
} else {
imagePreference = (IconListPreference) ((PhotoModule)mPhotoModule).getPreferenceGroup()
.findPreference(MOOD_IMAGE_KEY_PRE+""+position);
}
int index = imagePreference.findIndexOfValue(imagePreference.getValue());
int[] imageBackgroundId = imagePreference.getImageIdsBackground();
if (imageBackgroundId == null) {
return 0;
}
return imageBackgroundId[index];
}
private int getImageAddon1IdFromPreference(int position) {
IconListPreference imagePreference = null;
if (Util.IsExport()) {
imagePreference = (IconListPreference) ((PhotoModule)mPhotoModule).getPreferenceGroup()
.findPreference(MOOD_IMAGE_KEY_PRE_EX+""+position);
} else {
imagePreference = (IconListPreference) ((PhotoModule)mPhotoModule).getPreferenceGroup()
.findPreference(MOOD_IMAGE_KEY_PRE+""+position);
}
int index = imagePreference.findIndexOfValue(imagePreference.getValue());
int[] imageAddon1Id = imagePreference.getImageIdsAddon1();
if (imageAddon1Id == null) {
Log.i(TAG, "----- get null addon 1");
return 0;
}
return imageAddon1Id[index];
}
private int getImageAddon2IdFromPreference(int position) {
IconListPreference imagePreference = null;
if (Util.IsExport()) {
imagePreference = (IconListPreference) ((PhotoModule)mPhotoModule).getPreferenceGroup()
.findPreference(MOOD_IMAGE_KEY_PRE_EX+""+position);
} else {
imagePreference = (IconListPreference) ((PhotoModule)mPhotoModule).getPreferenceGroup()
.findPreference(MOOD_IMAGE_KEY_PRE+""+position);
}
int index = imagePreference.findIndexOfValue(imagePreference.getValue());
int[] imageAddon2Id = imagePreference.getImageIdsAddon2();
if (imageAddon2Id == null) {
Log.i(TAG, "----- get null addon 2");
return 0;
}
return imageAddon2Id[index];
}
之前的代码如上面所示。之所以这样做是因为要对一个功能根据项目作一些区别。但上面的代码的冗余主要体现在每次调用 MOOD_IMAGE_KEY_PRE 时均要作出判断。下面请看优化之后的代码:(绿色部分只调用一次)
public static final String MOOD_IMAGE_KEY_PRE;// = "pref_camera_water_mark_mood_image_key_";
static {
if(Util.IsExport()){
MOOD_IMAGE_KEY_PRE = "pref_camera_water_mark_mood_image_key_ex_";
} else {
MOOD_IMAGE_KEY_PRE = "pref_camera_water_mark_mood_image_key_";
}
}
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
if (position >= mImageIds.length) return;
ComboPreferences pref = new ComboPreferences(WaterMarkMoodImageActivity.this);
pref.setLocalId(WaterMarkMoodImageActivity.this,
WaterMarkMoodImageActivity.this.getIntent().getIntExtra("camera-id", 0));
Editor editor = pref.edit();
if(Util.IsExport()){
editor.putString(WaterMarkManager.MOOD_IMAGE_KEY_PRE+""+mSelectedIndex, ""+position);
editor.apply();
WaterMarkMoodImageActivity.this.finish();
}
private int getImageBackgroundIdFromPreference(int position) {
IconListPreference imagePreference =
(IconListPreference) ((PhotoModule)mPhotoModule).getPreferenceGroup()
.findPreference(MOOD_IMAGE_KEY_PRE+""+position);
int index = imagePreference.findIndexOfValue(imagePreference.getValue());
int[] imageBackgroundId = imagePreference.getImageIdsBackground();
if (imageBackgroundId == null) {
return 0;
}
return imageBackgroundId[index];
}
private int getImageAddon1IdFromPreference(int position) {
IconListPreference imagePreference =
(IconListPreference) ((PhotoModule)mPhotoModule).getPreferenceGroup()
.findPreference(MOOD_IMAGE_KEY_PRE+""+position);
int index = imagePreference.findIndexOfValue(imagePreference.getValue());
int[] imageAddon1Id = imagePreference.getImageIdsAddon1();
if (imageAddon1Id == null) {
Log.i(TAG, "----- get null addon 1");
return 0;
}
return imageAddon1Id[index];
}
private int getImageAddon2IdFromPreference(int position) {
IconListPreference imagePreference =
(IconListPreference) ((PhotoModule)mPhotoModule).getPreferenceGroup()
.findPreference(MOOD_IMAGE_KEY_PRE+""+position);
int index = imagePreference.findIndexOfValue(imagePreference.getValue());
int[] imageAddon2Id = imagePreference.getImageIdsAddon2();
if (imageAddon2Id == null) {
Log.i(TAG, "----- get null addon 2");
return 0;
}
return imageAddon2Id[index];
}
加了 static 块之后,其实我们只需要修改 static 块部分,其它的代码均不用作出改动。根据项目来判断,不同的项目将 MOOD_IMAGE_KEY_PRE 赋为不同的值即可。这样一来大大简化了要修改的代码。