Java使开关箱变短

Java使开关箱变短,java,switch-statement,case,fragmentstatepageradapter,Java,Switch Statement,Case,Fragmentstatepageradapter,我的FragmentStatePagerAdapter中有这个开关案例语句。我已经研究了许多类似的问题,但没有一个给出了较短的答案,这意味着切换案例仍在代码中 这段代码实际上是重复的,看起来很难看。有没有办法让这个看起来更短 @Override public SongListFragment getItem(int position) { SongListFragment slf = new SongListFragment(); switch (position) {

我的
FragmentStatePagerAdapter
中有这个
开关案例语句。我已经研究了许多类似的问题,但没有一个给出了较短的答案,这意味着
切换
案例仍在代码中

这段代码实际上是重复的,看起来很难看。有没有办法让这个看起来更短

@Override
public SongListFragment getItem(int position) {
    SongListFragment slf = new SongListFragment();
    switch (position) {
        case 0:
            slf.setAudioList(getAudioList(tabTitles[0]));
            slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
                @Override
                public void onClick(Audio audio) {
                    itemListener.onClick(audio);
                }
            });
            return slf;
        case 1:
            slf.setAudioList(getAudioList(tabTitles[1]));
            slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
                @Override
                public void onClick(Audio audio) {
                    itemListener.onClick(audio);
                }
            });
            return slf;
        case 2:
            slf.setAudioList(getAudioList(tabTitles[2]));
            slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
                @Override
                public void onClick(Audio audio) {
                    itemListener.onClick(audio);
                }
            });
            return slf;
        case 3:
            slf.setAudioList(getAudioList(tabTitles[3]));
            slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
                @Override
                public void onClick(Audio audio) {
                    itemListener.onClick(audio);
                }
            });
            return slf;
        case 4:
            slf.setAudioList(getAudioList(tabTitles[4]));
            slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
                @Override
                public void onClick(Audio audio) {
                    itemListener.onClick(audio);
                }
            });
            return slf;
        default:
            return null;
    }
}

由于每个开关箱的主体几乎相同,只是索引/位置不同。首先,您可以完全摆脱开关盒:

@Override
public SongListFragment getItem(int position) {
     SongListFragment slf = new SongListFragment();
     slf.setAudioList(getAudioList(tabTitles[position]));
     slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
        @Override
        public void onClick(Audio audio) {
            itemListener.onClick(audio);
        }
     });
     return slf;
}
在这里:


正如@SMA所建议的,Lino的答案是一个简单的边界检查

@Override
public SongListFragment getItem(int position) {
     if ( position < 0 || position >= tabTiles.length() ){
       //your previous default case
       return null;
     }else{
       SongListFragment slf = new SongListFragment();
       slf.setAudioList(getAudioList(tabTitles[position]));
       slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
         @Override
         public void onClick(Audio audio) {
              itemListener.onClick(audio);
            }
          });
     return slf;
   }
}
@覆盖
公共SongListFragment getItem(内部位置){
if(位置<0 | |位置>=tabTiles.length()){
//您以前的默认案例
返回null;
}否则{
SongListFragment slf=新的SongListFragment();
slf.setAudioList(getAudioList(tabTitles[position]));
slf.setItemOnClickListener(新的SongListFragment.SongListItemOnClickListener(){
@凌驾
公共void onClick(音频){
onClick(音频);
}
});
返回slf;
}
}
@覆盖
公共SongListFragment getItem(内部位置){
//不需要初始化
SongListFragment slf=null;
//位置为0到4,当位置超过tabTiles.length()时返回null

如果(position>=0&&position查看每种情况下的代码。标记公共部分,然后区别:除了一个整数之外,每件事情都是相同的,这就是开关值…你需要对
选项卡标题进行绑定检查,否则你会得到AIOOB异常。呃..现在我觉得自己像个傻瓜..我使用了case开关,因为我认为这是必要的在tablyout选项卡之间交换,但似乎不需要它。无论如何,谢谢你,除了这段代码不必要地复杂而且比公认的答案更糟糕之外,它甚至没有编译。我在发布它之前没有看到公认的答案,因为我已经打开了问题。
Public
不是Java。Th没有理由不更狭隘地声明返回类型。这段代码没有理由也从来没有理由使用
switch
语句。现在我注意到了这一点。我们获取位置的来源可能与
tabTitles
相同的数据源(或产生
tabTitles
的任何内容)。如果是这样,则该位置将不可能超出边界。然而,返回
null
,只是在任何代码中请求
NullPointerException
@Override
public SongListFragment getItem(int position) {
     if ( position < 0 || position >= tabTiles.length() ){
       //your previous default case
       return null;
     }else{
       SongListFragment slf = new SongListFragment();
       slf.setAudioList(getAudioList(tabTitles[position]));
       slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
         @Override
         public void onClick(Audio audio) {
              itemListener.onClick(audio);
            }
          });
     return slf;
   }
}
@Override
public SongListFragment getItem(int position) {
    // don't need to initialize
    SongListFragment slf = null;
    // The position is 0 to 4, returns null when position is over tabTiles.length() 
    if (position >= 0 && position <= 4 
        && position < tabTiles.length()) {
        slf = new SongListFragment();
        slf.setAudioList(getAudioList(tabTitles[position]));
        slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
            @Override
            public void onClick(Audio audio) {
                itemListener.onClick(audio);
            }
        });
    }
    // returns SongListFragment if it is null or not
    return slf;
}