【问题标题】:Substitute for if statements when using Constants使用常量时替换 if 语句
【发布时间】:2013-05-21 13:42:40
【问题描述】:

我认为描述我的问题的最佳方式是先描述我在做什么。

我有一个简单的活动,其中包含 3 个列表选择选项(启动列表视图的按钮)。 每个 ListPicker 在 ListView 中有 8 个项目。

Listview中的每一个Item,我们称其为Name值,都有对应的Address和Phone。

这里是我使用的常量的例子

public final String GROUP_1_VENUE_1_NAME = "1name1";
public final String GROUP_1_VENUE_1_ADDRESS = "1address1";
public final String GROUP_1_VENUE_1_PHONE = "1phone1";
public final String GROUP_1_VENUE_2_NAME = "1name2";
public final String GROUP_1_VENUE_2_ADDRESS = "1address2";
public final String GROUP_1_VENUE_2_PHONE = "1phone2";
public final String GROUP_1_VENUE_3_NAME = "1name3";
public final String GROUP_1_VENUE_3_ADDRESS = "1address3";
public final String GROUP_1_VENUE_3_PHONE = "1phone3";
.....

public final String GROUP_2_VENUE_1_NAME = "2name1";
public final String GROUP_2_VENUE_1_ADDRESS = "2address1";
public final String GROUP_2_VENUE_1_PHONE = "2phone1";
public final String GROUP_2_VENUE_2_NAME = "2name2";
public final String GROUP_2_VENUE_2_ADDRESS = "2address2";
public final String GROUP_2_VENUE_2_PHONE = "2phone2";
....

public final String GROUP_3_VENUE_1_NAME = "3name1";
public final String GROUP_3_VENUE_1_ADDRESS = "3address1";
public final String GROUP_3_VENUE_1_PHONE = "3phone1";
public final String GROUP_3_VENUE_2_NAME = "3name2";
public final String GROUP_3_VENUE_2_ADDRESS = "3address2";
public final String GROUP_3_VENUE_2_PHONE = "3phone2";
...

所以从 listPicker 中挑选了一个项目,现在我要评估结果

我有 3 个字符串需要设置;姓名、地址和电话

所以现在我有这样的东西......

if (selection.equals(GROUP_1_VENUE_1_NAME) {
    name = GROUP_1_VENUE_1_NAME;
    address = GROUP_1_VENUE_1_ADDRESS;
    phone = GROUP_1_VENUE_1_PHONE;
} else if (selection.equals(GROUP_1_VENUE_2_NAME) {
    name = GROUP_1_VENUE_2_NAME;
    address = GROUP_1_VENUE_2_ADDRESS;
    phone = GROUP_1_VENUE_2_PHONE;
} else if .....

等等等等。

所以,这是我的问题。有没有更简单的方法可以让我评估选择是否等于 NAME CONSTANTS 之一,如果是,设置相应的值?

【问题讨论】:

  • 我首先想到的是一个包含要设置的值的哈希图。密钥是selection。不过,我不确定代码是否具有可读性。
  • 将字符串存储在数组中并使用switch?
  • 我想,这里应该是笔误,phone = GROUP_1_VENUE_1_NAME;,应该是phone = GROUP_1_VENUE_1_PHONE;
  • 感谢大家的回复。我会尝试他们并根据我的发现选择最佳解决方案。

标签: java android loops if-statement constants


【解决方案1】:

我认为您需要从以下两个方向改进您的代码:

创建聚合姓名、电话和地址的新简单类:

class Contact {
    private final String name;
    private final String phone;
    private final String address;

    public Contact(String name, String phone, String address) {
        this.name = name;
        this.phone = phone;
        this.address = address;
    }
    // getters
}

使用 Map 存储选择映射:

private static final Map<String, Contact> selections = new HashMap<String, Contact>();
static {
    selections.put("3name1", new Contact("name1", "phone1", "address1"));
    // other selections
}

然后您可以通过查找地图来访问您的联系人:

Contact contact = selections.get(selection);

【讨论】:

    【解决方案2】:

    使用enum 作为常量。然后你可以很好地设置它并打开它:)

    【讨论】:

      【解决方案3】:

      您可以为Map&lt;String, String&gt; 类型的地址和电话分别准备一张地图

      然后您只需检查名称是否已知(如果输入始终已知,则跳过该部分),然后填写值,即:

      // Preparation
      addresses.put(GROUP_1_VENUE_1_NAME, GROUP_1_VENUE_1_ADDRESS);
      phones.put(GROUP_1_VENUE_1_NAME, GROUP_1_VENUE_1_PHONE);
      
      ...
      
      // Evaluation    
      name = selection;
      address = addresses.get(name);
      phone = phones.get(name);
      

      【讨论】:

        【解决方案4】:

        一种更好的OOP 方法是封装Person 类中的相关字段:

        public class Person{
        String name;
         String   address;
         String   phone;
        }
        

        然后使用Map&lt;String, Person&gt;,用人员对象填充它并与特定名称相关联,然后在选择时您可以简单地具有如下逻辑:

        Person selectedPerson = map.get(selection);
        

        并在需要的地方使用Person 属性(姓名、地址、电话)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-23
          • 2016-08-03
          • 2014-11-29
          • 1970-01-01
          • 2014-03-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多