例如,我得到了一个X类,它有两个名为ex的字段。 aField和bField。在主类中,我得到了对象类X的表和应该调用次数的函数,但是第一次它必须更改名为aField的字段,而在第二次调用中必须更改名为bField的字段。
class X{
int aField;
int bField;
}
class Main{
public X[] listX;
public int amount;
public static void requestedFunction(){
for(int i=0; i<amount; i++){
aField = 5;
// bField = 5;
// or this one when called second time in code ;
}
}
public static void main(String[] args) {
amount = 10;
listX= new X[amount];
requestedFunction(); // thsi usage change fields named aFields
requestedFunction(); // this usage change fields named bFields
}
}
有没有任何解决方案可以这样做?或者我需要做两个不同的功能?
答案 0 :(得分:0)
你可以使用reflection来做到这一点。该库允许您纯粹以“字符串”为基础处理类/字段。使用相应的库,您实际上可以编写一个方法,如
public void putValue(X instanceOfX, int value, String fieldName)
并称之为
putValue(x, 5, "fieldA");
但是:你最好不要那样做!反思很复杂,容易出错!当你决定稍后重命名你的字段时,你只会在运行时时注意到当你的putValue()方法被一个过时的字段名称调用时。
另一种方法是使用Map,例如:
Map<String, Integer> theValues = new HashMap<>();
所以你可以编写如下代码:
theValues.put("A", 5);
theValues.put("B", 5);
但真正的答案是:退一步看看你真正想要解决的问题。你知道,使用允许在A类字段中编写A类已经是一个坏主意。良好的OO设计的整个想法是不公开这样的实现细节。字段是实现细节,只有一个拥有类应该知道这些字段。
良好的OO是指将行为纳入您的课程。含义:您的类X不应提供其他类读取/写入的字段。相反,该类应该具有为其他方法“做那些事情”的方法(请注意:我不是在谈论用getter / setter方法替换字段访问!)。
答案 1 :(得分:0)
从技术上讲,您可以通过
实现这一目标enum ExecutionType {
ATYPE,
BTYPE
}
public static void requestedFunction(ExecutionType eType){
for(int i=0; i<amount; i++){
if (eType==ExecutionType.ATYPE)
aField = 5;
else if (eType ==ExecutionType.BTYPE)
bField = 5;
}
}
requestedFunction(ExecutionType.ATYPE);
requestedFunction(ExecutionType.BTYPE);
但是,实现此目的的正确方法是使用两个单独的功能。这种设计不太好,有可能在更复杂的情况下引起严重的头痛。
您也可以使用不使用参数的版本,但会违反越来越多的面向对象的主体。很难理解每次调用时都会执行不同操作的函数的行为。
答案 2 :(得分:0)
您还可以传递消费者并决定要修改的字段。 这是一个小例子:
=IFERROR(INDEX(myRange,ROWS($N$2:N2)-INT((ROWS($N$2:N2)-1)/ROWS($B$4:$G$15))*ROWS($B$4:$G$15),INT(((ROWS($N$2:N2)-1)/ROWS($B$4:$G$15)+1))),"")