Java 缩短 switch case 语句

Java making switch case statment shorter

我的 FragmentStatePagerAdapter 中有这个 switch case statement。我研究了许多类似的问题,但 none 提供了一个较短的答案,这意味着 switch 案例仍在他们的代码中。

这段代码确实重复而且很难看。有没有办法让它看起来更短?

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

由于每个开关盒的主体几乎相同,只是index/position不同。您可以首先完全摆脱 switch case:

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

这里:

  @Override
public SongListFragment getItem(int position) {
    switch (position) {
        case 0:
            return yourMethod(0);
        case 1:
            return yourMethod(1);
        case 2:
            return yourMethod(2);
        case 3:
            return yourMethod(3);
        case 4:
            return yourMethod(4);
        default:
            return null;
    }
}

private Object yourMethod(int i) {
    SongListFragment slf = new SongListFragment();
    slf.setAudioList(getAudioList(tabTitles[i]));
    slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
        @Override
        public void onClick(Audio audio) {
            itemListener.onClick(audio);
        }
    });
    return slf;
}

Lino 的回答是按照@SMA 建议的简单绑定检查。

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