在我的应用程序中,用户可以选择文本并使用图像上显示的选项对其进行样式设置。在查看我的代码时,我想知道我的所有switch语句的语句是break
还是return true/false
以及它是否有任何影响?我可以通过Log.d();
使用break
退出切换方法并使用return
保留在交换机
所以在这种情况下,案件中发生的事情是否重要?
Switch案例的方法:
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.textcolor:
f3 = ColorPickerDialogFrag2.newInstance(3, Color.WHITE);
f3.setStyle(android.support.v4.app.DialogFragment.STYLE_NORMAL, R.style.AppTheme);
f3.show(fragmentManager, "d");
f3.setListener(this);
break;
//--------------------BOLD----------------------------
case R.id.bold:
styleSpans = str.getSpans(selectionStart, selectionEnd, StyleSpan.class);
for (int i = 0; i < styleSpans.length; i++) {
if (styleSpans[i].getStyle() == android.graphics.Typeface.BOLD) {
str.removeSpan(styleSpans[i]);
exists = true;
}
}
if (!exists) {
str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), selectionStart, selectionEnd,
Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
editText.setSelection(selectionStart, selectionEnd);
return true;
//--------------------ITALIC----------------------------
case R.id.italic:
styleSpans = str.getSpans(selectionStart, selectionEnd, StyleSpan.class);
for (int i = 0; i < styleSpans.length; i++) {
if (styleSpans[i].getStyle() == android.graphics.Typeface.ITALIC) {
str.removeSpan(styleSpans[i]);
exists = true;
}
}
if (!exists) {
str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), selectionStart, selectionEnd,
Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
editText.setSelection(selectionStart, selectionEnd);
Log.d(LOG_TAG, "italic");
break;
//--------------------UNDERLINE----------------------------
case R.id.underline:
UnderlineSpan[] underSpan = str.getSpans(selectionStart, selectionEnd, UnderlineSpan.class);
for (int i = 0; i < underSpan.length; i++) {
str.removeSpan(underSpan[i]);
exists = true;
}
if (!exists) {
str.setSpan(new UnderlineSpan(), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
editText.setSelection(selectionStart, selectionEnd);
Log.d(LOG_TAG, "underline");
return true;
//--------------------STROKE----------------------------
case R.id.stroke:
Log.d(LOG_TAG, "stroke");
android.text.style.StrikethroughSpan[] strokeSpan = str.getSpans(selectionStart, selectionEnd, android.text.style.StrikethroughSpan.class);
for (int i = 0; i < strokeSpan.length; i++) {
str.removeSpan(strokeSpan[i]);
exists = true;
}
if (!exists) {
str.setSpan(new android.text.style.StrikethroughSpan(), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
editText.setSelection(selectionStart, selectionEnd);
return false;
case R.id.increase:
Log.d(LOG_TAG, "increase");
str.setSpan(new RelativeSizeSpan(1.1f), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
editText.setSelection(selectionStart, selectionEnd);
break;
case R.id.decrease:
str.setSpan(new RelativeSizeSpan(0.9f), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
editText.setSelection(selectionStart, selectionEnd);
break;
case android.R.id.cut:
CharSequence charSequence = editText.getText().subSequence(selectionStart, selectionEnd);
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("simple text", charSequence);
clipboard.setPrimaryClip(clip);
editText.getText().replace(selectionStart, selectionEnd, "");
Toast.makeText(context, R.string.toastCopy, Toast.LENGTH_SHORT).show();
break;
case android.R.id.copy:
charSequence = editText.getText().subSequence(selectionStart, selectionEnd);
clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
clip = ClipData.newPlainText("simple text", charSequence);
clipboard.setPrimaryClip(clip);
Toast.makeText(context, R.string.toastCopy, Toast.LENGTH_SHORT).show();
break;
case R.id.textfont:
FontFragment fontFragment = new FontFragment(selectionStart, selectionEnd, editText);
fontFragment.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.CustomDialog);
fontFragment.show(fragmentManager, "fontfragment");
break;
}
}
Log.d(LOG_TAG, "out of switch");
return true;
}
答案 0 :(得分:5)
在交换机中使用return stay
这是不正确的。 return
语句肯定会 保留在switch
语句中。 return
将立即从方法返回。方法中的其余代码将不会被执行。这就是为什么在使用return
时没有看到switch语句之后的日志语句。
break
或return
将退出switch语句。任何一个都可以。关于在方法中使用多个return
语句存在很多争议。
有些人希望在方法结束时只有一个return
语句。这种做法最不令人惊讶:当您维护软件并需要进行更改时,您可以在切换后添加语句并执行它们。您不需要找到每个return
并调整每个{。}。
但是,有时会有多个return
语句的良好用法。例如,如果您立即测试错误条件并return
,则可以缩短代码并避免不必要的深度缩进。有时它需要多余的标志和错综复杂的逻辑来避免额外的返回语句。
最后,考虑将来几个月和几年阅读和理解您的代码的清晰度和易用性。那时差异很重要。以最简单,最清晰的方式编写代码。我建议拆分你的switch语句,并为每个块分别设置方法。然后声明会更短更清晰。您可以在屏幕上看到每个案例而无需滚动并迷失在噪音中,并且能够看到每个breaks
。或者使用if-else语句,以便在case
失败时因为忘记了break
而感到惊讶。
答案 1 :(得分:2)
您可以使用break
或return
退出case
块,但return
也会立即退出该方法。这就是为什么&#34;出于开关&#34;使用return时不会记录。