实现HashMap的有效方法<;布尔值,对象>;:JAVA

实现HashMap的有效方法<;布尔值,对象>;:JAVA,java,android,Java,Android,我有一个函数,其中我必须发送对象的两种状态: void functionA(MyObject objStateOff, MyObject objStateOn){ } 通常只有两种状态:开和关 但是,我不希望这个函数有两个相同类型的参数,而是希望将它们组合起来。所以我想做一个HashMap。 但由于这个地图最多只包含两个条目,这似乎是在浪费资源,因为我正在为Android开发 那么,有没有更好的方法来传递这两个对象,而不让两个对象使用HashMap或函数签名中有两个参数 更新:我想看看是否有其

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

void functionA(MyObject objStateOff, MyObject objStateOn){
}
通常只有两种状态:开和关 但是,我不希望这个函数有两个相同类型的参数,而是希望将它们组合起来。所以我想做一个HashMap。 但由于这个地图最多只包含两个条目,这似乎是在浪费资源,因为我正在为Android开发

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

更新:我想看看是否有其他方法可以从根本上改善以下方面: 可读性、性能(尽管我认为这不会改变)和可维护性


谢谢。

总是有
类()。或者你可以传递一个包含两个元素的
MyObject[]

我认为这个问题没有唯一正确的答案。就我个人而言,我会给函数留下两个参数,因为这实际上并不太多,而这些参数的名称可以帮助我避免诸如“map/array的哪个元素用于on state”之类的混淆。

您可以始终使用composition

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

一开始可能看起来有些过分,但它比数组更安全


希望这有帮助。

您可以使用一个简单的ArrayList

ArrayList<MyObject> a = new ArrayList<MyObject>();

a.add(objStateOff); a.add(objStateOn); 

void functionA(ArrayList<MyObject>) {
...
}

functionA(a);

这样,您就不需要指定任何约定,只需在参数的右边设置off或on(您可以使用字符串或布尔值而不是int(我的意思是,您可以使用“on”或“off”),如果您的要求是有两个对象状态,那么为什么在MyObject中没有类似boolean stateOfObject的字段呢。然后在functionA中,您可以检查状态并执行所需的逻辑。当您只有两种状态时,为什么要发送两个对象使问题复杂化?可能您必须提及使用它的上下文,以及当对象只能处于一种状态时,为什么需要将两个对象传递给函数。 可能您可以使用枚举:

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());

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

  • 可读性:访问器方法描述每个对象的功能<代码>状态。获取(true)
,这是什么意思
states.getFooOnState()
,这非常清楚地为我提供了打开foo时的状态
  • 可维护性:如果您需要,添加新状态会容易得多;您只需向该类添加一个新字段。可能您需要一个
    MyObject
    用于当foo的状态为未知/正在初始化时,或者您希望添加在foo打开或关闭时触发的事件处理程序。当前方法的一个缺点是,这类事情将通过签名级联:
    functionA
    需要添加一个新参数,这意味着调用
    functionA
    functionB
    现在需要获取该额外参数(以便它可以将其传递给
    functionA
    ),这意味着
    function c
    需要获取它,依此类推
  • 可读性问题的一个警告是,在使用这些
    MyObject
    s时,您将获得可读性,而不是在您最初设置它们的地方。在那里,您将创建一个新的
    MyObjectState
    (或您命名的任何名称),并且构造函数看起来与您的
    函数一样通用:

    MyObjectState s = new MyObjectState(objStateOff, objStateOn);
    
    您可以通过为
    MyObjectState
    创建一个构建器来解决这个问题,但这可能有些过头了


    就性能而言,您不会比现有的更好。但是,自定义类将在总体方案中增加相当小的开销(在额外内存、GC活动等方面)。

    我不是故意这么说的,但是像您这样传递两个参数有什么不对?也就是说,你想解决的问题是什么?您可以创建一个带有两个
    MyObject
    字段的自定义类,但这不一定更具可读性。在我们不知道为什么要将这两个参数组合在一起的情况下,很难提出这样做的最佳方法。是的,我可以一直这样做,但我想问一下,是否有更好的方法来处理这种情况,但再说一次,在什么意义上更好?你想改进什么?可读性、性能、可维护性、可扩展性?我们需要更多的信息,因为正如所写的,没有一个单一的,正确的答案。为歧义道歉,我想看看是否有任何其他方法可以从根本上改善以下方面:1。可读性、性能(尽管我认为这不会改变)和可维护性。是的,但问题是,实现此功能的人员如何知道,哪个索引用于on,哪个索引用于OFF在两个元素的数组中没有多少需要测试/检查的。你可以使用一个内部约定,在代码的每一部分中,一致地确定哪个状态是开的还是关的(如果你使用其他东西,则必须以同样的方式遵循约定)。你是对的。在这两种情况下都需要公约。我想如果我真的不想使用约定,那么我必须按照Tanmay@Sunny,我提出了另一个不需要约定的想法,确切地说…MyObject包含一组特定过程的设置,例如开始时间、长度、结束时间、速度,等等。因此,在其中设置状态开/关将是一个糟糕的设计,因为这样对象将不再定义某个特定状态的设置,并且变得模棱两可。感谢您的详细解释。非常欢迎您,感谢您在上面的评论中澄清您的问题!
    MyObjectState s = new MyObjectState(objStateOff, objStateOn);