Java 开关箱太大了

Java 开关箱太大了,java,android,Java,Android,创建片段的活动取决于位置: private void displayView(int position) { try { Fragment currentFragment = null; Bundle args = new Bundle(); Bundle filter = new Bundle(); args.putBundle(Fra

创建片段的活动取决于位置:

    private void displayView(int position) {
            try {
                Fragment currentFragment = null;
                Bundle args = new Bundle();
                Bundle filter = new Bundle();
                args.putBundle(FragmentSort.FILTER, filter);
                switch (position) {
                    case 1: 
                        currentFragment = Fragment.instantiate(this, Fragment_A.class.getName());
                        toolbaTitleTextView.setText(getString(R.string.title_AA));
                        filter.putBoolean(Offer.FAVORITE, true);
                        break;
                    case 2: 
                        currentFragment = Fragment.instantiate(this, Fragment_Z.class.getName());
                        toolbaTitleTextView.setText(getString(R.string.title_XX));
                        break;

                       ...
                      case 20:
                        currentFragment = Fragment.instantiate(this, Fragment_X.class.getName());
                        toolbaTitleTextView.setText(getString(R.string.title_BBB));
                        filter.putBoolean(Offer.DOWNLOADED, true);
                        break;
                    default:
                        break;
                }

                if (currentFragment != null) {
                    FragmentManager fragmentManager = getSupportFragmentManager();
                    currentFragment.setArguments(args);
                    fragmentManager.beginTransaction().replace(R.id.fragmentsContainer, currentFragment).commit();
                } else {
                    Debug.e(TAG, "displayView: Error in creating fragment");
                }
            } finally {
                drawerLayout.closeDrawers();
            }
    }
如您所见,活动创建片段取决于位置。每个片段都有一组特定的参数和特定的标题。 好啊这是工作

问题是
开关箱
很大

如何修改此代码以获得更可读的代码


也许使用一些创作模式?例如,
工厂方法

你的片段都是一样的吗? 或者你有20种不同的碎片

对于我的第一个问题,如果

您应该在类中创建一个片段列表,而不是使用开关大小写,您只需在当前位置抓住列表中的项并进行处理,如下所示:

    Fragment currentFragment = YOURLISTOFFRAGMENTS.get(position);
    Bundle args = new Bundle();
    Bundle filter = new Bundle();
    args.putBundle(FragmentSort.FILTER, filter);
...
如果我的第一个问题是,第二个问题是,您应该以更复杂的方式执行,您的所有片段都应该实现一个接口,该接口将有一个方法,此方法实现可能会因每个片段而改变,但应该具有相同的参数和返回。然后回到类中,您将按照接口声明的方式处理所有片段。像这样

public interface HandleName{

    String print()

}


public class MyFrag1 implements HandleName{

    @Override
    public String print(){
        return "MyFrag1"
    }
}


public class MyFrag2 implements HandleName{

    @Override
    public String print(){
        return "MyFrag2"
    }
}
回到你的课堂上,你应该这样做

HandleName interfaceNamedFragment = YOURLISTOFFRAGMENTS.get(position);
interfaceNamedFragment.print()

PS:我还没有测试过这段代码,但这是总体思路

如果确实有必要,请利用类名和字符串的顺序性质

String fragmentString = "Fragment_"+position;
currentFragment = Fragment.instantiate(this, fragmentString);
供字符串使用

String resourceString = "title_"+position;
int resourceId = this.getResources().getIdentifier(resourceString, "string", this.getPackageName());
toolbaTitleTextView.setText(getString(resourceId));
您可能需要将过滤器设置转换到各个片段中,使其更加具体。

您可以使用,首先定义一个包含每个案例所需的每个值(实例)的接口,如果需要,它可以使用参数

public abstract class FragmentFactory(){
     public abstract Fragment getFragment();
     public abstract Bundle getFilter();
     public abstract String getTooltipText();
}
您实现了每个工厂,每个片段一个,如果只有一个方法更改,这可以继承另一个工厂。。。这需要进行适当的分析

然后,您只需要一种方法来获取特定
位置的工厂

对每个实例使用
列表

public static FragmentFactory getFragment(int position){
    return listFactory.get(position);
}
或者用一个好的旧开关

public static FragmentFactory getFragment(int position){
    switch(position){
    case 1:
         return Factory1;
    case 2:
         return Factory2;
    ...
    default:
         throw new IllegalArgument("No Fragment defined for that position");
}

请注意,只需将当前开关置于
工厂.getFragment(int位置)
中即可

使用实例而不是创建20个不同的类?@Zoe post作为答案。我建议你研究策略模式,而不是没有更多的代码@IntelliJAmiya。如果这些片段的内容是20个不同的片段,这是不可行的。如果/直到OP发布更多的代码(到了可以写出一个像样答案的程度),我will@guisantogui“战略模式”是一种行为模式。但我想我需要一个创作模式。我说得对吗?很详细。我认为这不是一个更容易的解决方案,而是设计过度,进一步增加了编码工作量。@ir2pid模式不仅使问题变得更容易,而且为您提供了更易于维护的代码。使用带有多态性的定义代码更易于调试。当然,这是一个5分钟的解决方案……我宁愿使用枚举,也不希望片段在某一点上不被重构。这可能只会导致类名出现意外问题。