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