java - 在这种情况下,我的 Switch 语句应该以 break 或 return x 退出吗?

标签 java android

在我的应用程序中,用户可以选择文本并使用图像上显示的选项设置样式。在查看我的代码时,我想知道我的 switch 语句的所有 case 语句是否都应break返回 true/false,它是否有任何影响?我可以通过使用 Log.d(); 看到 break 离开 switch 方法并使用 return 留在 switch 中

所以在这种情况下,案件中发生的事情重要吗?

enter image description here

使用 Switch case 的方法:

@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;

}

最佳答案

using return stays in the switch

这是不正确的。 return 语句绝对不会留在switch 语句中。 return 将立即从方法返回。该方法中的其余代码将不会执行。这就是为什么在使用 return 时看不到 switch 语句之后的日志语句的原因。

breakreturn 都会退出 switch 语句。两者都可以。关于在一个方法中使用多个 return 语句存在很多争论。

有些人更喜欢在方法末尾只有一个 return 语句。这种做法的好处是最不令人惊讶:当您维护软件并需要进行更改时,您可以在切换后添加语句,它们将被执行。您不需要找到每个 return 并调整每个。

然而,有时,多个 return 语句有很好的用途。例如,如果您测试错误条件并立即返回,这可以使您的代码更短并避免不必要的深度缩进。有时它需要过多的标志和复杂的逻辑来避免额外的返回语句。

最终,请考虑在未来数月和数年内阅读和理解您的代码时的清晰度和易用性。那时候差异就很重要了。尽可能以最简单明了的方式编写代码。我建议将您的 switch 语句分开,并为每个 block 使用单独的方法。这样声明就会更短更清楚。您将能够在屏幕上看到每个案例,而无需滚动和迷失在噪音中,并且能够看到每个中断。或者使用 if-else 语句,这样当 case 因为忘记了 break 而失败时,您不会感到惊讶。

关于java - 在这种情况下,我的 Switch 语句应该以 break 或 return x 退出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39883833/

相关文章:

java - 如何创建包含从 1 到 n 的所有数字的二叉搜索树

python - 如何将 Python 程序(在 PC 上)连接到 Android 应用程序(在手机上)?

php - 在 PHP 中使用 Parse 将相同的通知推送到多个 Android 设备

java - 单击按钮上的 JFileChooser

java - 在Java中表示可变长度矩阵(二维数组)的最佳方式?

java - 我如何在 while 循环中使用 java 扫描器

android - ImageView 图像的显示区域

android - Google Play -505 安装错误

android - 如何防止一个activity被多次初始化

java - Jenkins - 配置 JDK - 只有文本框,自动安装失败