【问题标题】:Java making switch case statment shorterJava使switch case语句更短
【发布时间】:2018-07-03 12:57:32
【问题描述】:

我的FragmentStatePagerAdapter 中有这个switch case statement。我研究了许多类似的问题,但没有一个提供更简短的答案,这意味着 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;
    }
}

【问题讨论】:

  • 查看每种情况下的代码。标记共同的部分和不同的部分:除了一个整数之外,所有的东西都是一样的,那就是开关值......

标签: java switch-statement case fragmentstatepageradapter


【解决方案1】:

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

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

【讨论】:

  • 你需要对 tabTitles 进行绑定检查,否则你会得到 AIOOB 异常。
  • Eh.. 现在我觉得自己像个傻瓜.. 我使用大小写切换是因为我认为在 tablyout 选项卡之间切换是必要的,但看起来并不需要它。无论如何,谢谢你
【解决方案2】:

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

【讨论】:

  • 我们获取位置的来源可能与tabTitles(或任何产生tabTitles)的数据源相同。如果是这样,该位置将不可能超出范围。然而,返回 null 只是在乞求 NullPointerException 在任何代码中调用它。
【解决方案3】:

这里:

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

【讨论】:

  • 除了这段代码不必要地复杂并且比公认的答案更糟糕之外,它甚至无法编译。
  • 在发布之前我没有看到接受的答案,因为我已经打开了问题。
  • Public 不是 Java。没有理由不更严格地声明返回类型。这段代码根本没有理由,也从来没有使用switch 语句。
  • 现在我注意到了。
【解决方案4】:
@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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多