在我的Java源代码的一种方法中,多次出现相同的代码块:
<some code>
<some code>
<block of code>
<some code>
<block of code>
<some code>
<some code>
<some code>
<block of code>
<some code>
<some code>
<block of code>
<some code>
etc..
这段代码的作用是找出对象的哪些属性应该是要遵循的代码的目标。更具体地说,在块的开头我们有一个字符串“Object.property”,代码的任务是解析它,以便找出对象“Object”的类型,以及“Object”的属性“”财产“是。当完成该操作并且块结束时,执行继续对所述对象的所述属性执行某些操作。该属性可用于比较,或者可以分配给它。
现在,我的问题是我想通过将此块放在另一个方法中来稍微整理代码,然后我可以多次调用它。此外,如果我在这个块中发现了一个错误,我就不需要经历每一次修复它 - 只需要一种方法。
所以这基本上就是我想做的事情:
<some code>
<some code>
property = parse();
<some code>
property = parse();
<some code>
<some code>
<some code>
property = parse();
<some code>
<some code>
property = parse();
<some code>
etc..
property parse(){
<block of code>
return property;
}
现在,由于Java没有任何指针,我不能举例说明这个新方法返回一个整数属性。将返回该整数的副本(按值传递),我的所有其余代码将处理的是属性的本地整数副本,而不是属性本身。当然,如果仅在比较中使用该属性,那么这很好,但是当我的其余代码想要为其分配内容时,事情就不再起作用了。
是否有一个聪明而简单的解决方法,以便我可以缩短我的Java代码,并且在修改它时,我只需要修改代码的一部分?
编辑:
为了给你一些真正的代码,代码块可能看起来像这样,当它没有放在一个不同的方法中,在它得到一个名为toParse的字符串之后(为了这个例子可以是“niceShirt.size”) :
String[] parts = toParse.split('\\.');
if(pantsList.containsKey(parts[0])){
if(parts[1] == "size") pantsList.get(parts[0]).size += 1;
if(parts[1] == "daysWorn") pantsList.get(parts[0]).daysWorn += 1;
}
if(shirtsList.containsKey(parts[0])){
if(parts[1] == "size") shirtsList.get(parts[0]).size += 1;
if(parts[1] == "daysWorn") shirtsList.get(parts[0]).daysWorn += 1;
}
if(shoesList.containsKey(parts[0])){
if(parts[1] == "size") shoesList.get(parts[0]).size += 1;
if(parts[1] == "daysWorn") shoesList.get(parts[0]).daysWorn += 1;
}
现在像这样的代码多次发生,我希望有这样的方法:
String[] parts = toParse.split('\\.');
if(pantsList.containsKey(parts[0])){
if(parts[1] == "size") return pantsList.get(parts[0]).size;
if(parts[1] == "daysWorn") return pantsList.get(parts[0]).daysWorn;
}
if(shirtsList.containsKey(parts[0])){
if(parts[1] == "size") return shirtsList.get(parts[0]).size;
if(parts[1] == "daysWorn") return shirtsList.get(parts[0]).daysWorn;
}
if(shoesList.containsKey(parts[0])){
if(parts[1] == "size") return shoesList.get(parts[0]).size;
if(parts[1] == "daysWorn") return shoesList.get(parts[0]).daysWorn;
}
我在其余代码中需要做的就是:
parse(toParse) += 1;
..但这不起作用,因为解析(toParse)现在是一个副本,一个按值返回,所以它对该对象的不动产无效。
我希望这有助于澄清问题?
答案 0 :(得分:2)
您可以将getter和setter包装在实现简单接口的匿名类的对象中:
interface PropertyInfo {
Object get();
void set(Object value);
}
parse()
方法将返回此接口的实现,该接口知道如何执行get,并且还知道如何根据从调用者传入的其他数据执行set操作:
private PropertyInfo parse(...) { // take some parameters
// Find your getter and setter through reflection
final Method getter = ...
final Method setter = ...
return new PropertyInfo() {
public Object get() {
// Use the getter
}
public void set(Object value) {
// Use the setter
}
};
}
当您需要在条件中使用该属性时,您可以使用以下内容:
PropertyInfo p = parse(...); // pass whatever needs to be parsed
if (p.get() == 123) ...
当您需要设置属性时,您可以像这样调用它:
PropertyInfo p = parse(...); // pass whatever needs to be parsed
p.set(123);
答案 1 :(得分:0)
使您的方法无效并使第一个参数成为“句柄”对象 - 一个具有整数字段的简单对象。该对象将按值传递,但其值可以根据需要进行修改。