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;
}
我的 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;
}