gpt4 book ai didi

Java 对象属性的值传递解决方法

转载 作者:行者123 更新时间:2023-12-02 07:37:14 25 4
gpt4 key购买 nike

在我的 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..

这段代码的作用是找出对象的哪些属性应该是要遵循的代码的目标。更具体地说,在 block 的开头,我们有一个字符串“Object.property”,代码的任务是解析它,以便找出对象“Object”是什么类型,以及“Object”的属性是什么。 ” “属性(property)”是。完成后, block 结束,执行继续对所述对象的所述属性执行某些操作。该属性可以用于比较,或者可以为其分配某些内容。

现在,我的问题是我想通过将此 block 放入另一个方法中来稍微整理一下代码,然后我可以多次调用该方法。此外,如果我在这个 block 中发现错误,我不需要遍历每一次事件来修复它 - 只需一个方法。

所以这基本上就是我想做的:

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

..但这不起作用,因为 parse(toParse) 现在是一个副本,一个按值返回,因此它对对象的真实属性没有任何作用。

我希望这有助于澄清问题?

最佳答案

您可以将 getter 和 setter 包装在实现简单接口(interface)的匿名类的对象中:

interface PropertyInfo {
Object get();
void set(Object value);
}

parse() 方法将返回此接口(interface)的实现,该实现知道如何执行 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);

关于Java 对象属性的值传递解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12041854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com