函数中的不同参数

时间:2016-10-29 14:05:45

标签: java function arguments

例如,我得到了一个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
    }
}

有没有任何解决方案可以这样做?或者我需要做两个不同的功能?

3 个答案:

答案 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))),"")