我有一个函数,我必须发送一个对象的两个状态:
void functionA(MyObject objStateOff, MyObject objStateOn){
}
总会有两种类型的状态:开和关
但是我没有为这个函数提供两个相同类型的参数,而是希望将它们组合起来。所以我想的是HashMap<Boolean, MyObject>.
但由于这张地图最多只包含两个条目,因此我似乎在浪费资源,因为我正在为Android开发。
那么,有没有更好的方法来传递这两个对象,而没有两个使用HashMap或在函数签名中有两个参数?
更新:我想看看是否有任何其他方法基本上可以改善以下内容: 可读性,性能(即使我认为不会改变)和可维护性
感谢。
答案 0 :(得分:2)
我会创建一个包含两个MyObject
字段的自定义类,以及每个字段的访问器。根据您的目标,这有几个很大的优势:
states.get(true)
,这是什么意思? states.getFooOnState()
,这显然让我成为foo开启时的状态。MyObject
,或者你想要添加在foo打开或关闭时触发的事件处理程序。当前方法的一个缺点是这些类型的东西将通过您的签名级联:functionA
需要添加一个新参数,这意味着functionB
调用functionA
需要现在获得额外的参数(因此它可以将其传递给functionA
),这意味着functionC
需要获取它,依此类推。对可读性问题的一个警告是,在使用这些MyObject
的情况下,您将获得可读性,但不会在首次设置它们时获得。在那里,您将创建一个新的MyObjectState
(或您命名的任何名称),构造函数看起来与您的functionA
一样通用:
MyObjectState s = new MyObjectState(objStateOff, objStateOn);
你可以通过为MyObjectState
创建构建器来解决这个问题,但这可能有点过分。
表现明智,你不会比现有的更好。但是一个自定义类将在宏观方案中增加相当小的开销(在额外内存,GC活动等方面)。
答案 1 :(得分:0)
始终有Pair
班(http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/Pair.html)。或者您可以传递带有两个元素的MyObject[]
。
答案 2 :(得分:0)
我认为这个问题并没有唯一正确的答案。我个人会给这个函数留下两个参数,因为这并不太多,这个参数的名称可以帮助我避免混淆像#34; map / array的哪个元素用于on状态?&#34 ;
答案 3 :(得分:0)
您可以随时使用合成。
创建一个包含两个MyObject
类型对象的类。
一开始可能看起来有点过头了,但它比阵列更安全。
希望这有帮助。
答案 4 :(得分:0)
您可以使用简单的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(我的意思是,您可以使用&#34; ON&#34;或&#34; OFF&#34;,字面意思))。
答案 5 :(得分:0)
如果你的要求是有两个对象状态,那么你为什么在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());