实现HashMap<Boolean,Object>:Java的有效方法



我有一个函数,我必须在其中发送对象的两种状态:

void functionA(MyObject objStateOff, MyObject objStateOn){
}

而且总是只有两种类型的状态:开和关但是,我希望将它们组合在一起,而不是为该函数设置两个相同类型的参数。所以我在想做个HashMap<Boolean, MyObject>.但是由于这张地图最多只包含两个条目,这似乎是浪费资源,因为我正在为 Android 开发。

那么,有没有更好的方法来传递这两个对象,而无需让两个对象使用 HashMap 或在函数签名中有两个参数?

更新:我想看看是否有任何其他方法可以基本上改善以下内容:可读性,性能(即使我认为这不会改变)和可维护性

谢谢。

我会创建一个自定义类,其中包含两个MyObject字段,以及每个字段的访问器。根据您的目标,这有几个很大的优势:

  • 可读性:访问器方法描述每个对象的作用。 states.get(true),这是什么意思? states.getFooOnState(),这很明显让我了解了 foo 打开时的状态。
  • 可维护性:如果需要添加新状态要容易得多;您只需向此类添加一个新字段即可。也许您需要一个MyObject,说明 foo 的状态何时未知/正在初始化,或者您可能希望添加在 foo 打开或关闭时触发的事件处理程序。您当前方法的一个缺点是,这些东西会通过您的签名级联: functionA需要添加一个新参数,这意味着functionB调用functionA现在需要获取该额外参数(以便它可以将其传递给functionA),这意味着functionC需要获取它, 等等。
可读性

问题的一个警告是,您将在使用这些MyObject的地方获得可读性,而不是在您第一次设置它们的地方获得可读性。在那里,您将创建一个新的MyObjectState(或任何您命名的名称),构造函数看起来与您的functionA一样通用:

MyObjectState s = new MyObjectState(objStateOff, objStateOn);

您可以通过MyObjectState创建一个构建器来解决这个问题,但这可能有点矫枉过正。

性能方面,你不会比你已经拥有的更好。但是自定义类将在宏伟的计划中增加相当小的开销(在额外内存、GC 活动等方面)。

总是有Pair类(http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/Pair.html)。 或者,您可以传递包含两个元素的MyObject[]

我认为这个问题没有唯一的正确答案。就个人而言,我会将函数留给两个参数,因为这实际上并不过分,并且此参数的名称可以帮助我避免混淆,例如"map/array 的哪个元素用于状态?

您可以随时使用合成。

创建一个包含两个MyObject类型的对象的类。

乍一看可能看起来有点矫枉过正,但它比阵列更安全。

希望这有帮助。

您可以使用一个简单的 ArrayList。

ArrayList<MyObject> a = new ArrayList<MyObject>();
a.add(objStateOff); a.add(objStateOn); 
void functionA(ArrayList<MyObject>) {
...
}
functionA(a);

或者一个简单的参数逻辑:

void functionA(int x) {
    MyObject state;
    if (x == 0) { 
        MyObject state = objStateOff; // Supposing they were defined somewhere before.
    } else if (x == 1) {
        MyObject state = objStateOn;
    }
    if (state != null) {
        // Use MyObject state.
    }
}

这样,您不需要指定任何约定,只需在参数上设置 off 或 on 即可(您可以使用字符串或布尔值代替 int(我的意思是,您可以使用"ON"或"OFF",字面意思))。

如果你的要求是有两个对象状态,那么为什么你在MyObject中没有像布尔stateOfObject这样的字段。然后在函数 A 中,您可以检查状态并执行所需的逻辑。当您只有两个状态时,为什么要通过发送两个对象来复杂化?可能你必须提到你使用它的上下文,以及为什么当对象只能处于一种状态时,你需要将两个对象传递给函数。也许你可以使用枚举:

public enum StateOfObject {
 ON(10,2), 
 OFF(15,5);
 private final int length;
 private final int speed;
 StateOfObject(int length, int speed) {
    this.length = length;
    this.speed = speed;
 }
 public MyObject getObject() {
    MyObject myObj = new MyObject();
    myObj.setLength(this.length);
    myObj.setSpeed(this.speed);
    return myObj;           
 }  
}

像这样使用它:

 MyObject onObject = StateOfObject.ON.getObject(); 
        System.out.print("Length: " + onObject.getLength() +
                  " Speed: " + onObject.getSpeed());

最新更新