【问题标题】:How to change object attributes inside methods dynamically如何动态更改方法内的对象属性
【发布时间】:2017-11-03 01:26:35
【问题描述】:

我有这个问题,因为我正试图让我的程序“更好”:P

class GlobalVariables {

    int att1;
    int att2;
    int att2;...

我使用该类来处理我在程序中需要的几乎所有全局值。

此类GlobalVariables 包含许多属性,每一个属性都是从传感器检索的,并且可以从method3 更改,method3 是一种将某些值保持在范围内的验证方法。

在 Main 类中,我有一个 another 类的对象(比如说class2)。

这个对象(比如说car)有一个方法:

car.method(gl)

glGlobalVariables 的一个实例。

现在,在方法内部,我调用method2,在内部调用method3(均来自class2)。

this.method3 (int att1, int att2, int att3,)
this.method3 (int att2, int att3, int att1,)
this.method3 (int att3, int att1, int att2,)

目前,我们有很多method3 的调用,这3 个参数可以是这些传感器值的组合,因此att1 可以说是att37

所以method3的声明是这样的:

public void method3 (int n1, int n2, int n3){
     n3=n1+n2;
}

当 Java 只允许我们按值传递值时,我应该怎么做才能更改 globalVariable.attXXX

我当然可以再制作 2 个方法并调用相应的方法并使用 SET,但我认为这几乎是我想要避免的。

当我说 SET 时,我指的是 SETTER

【问题讨论】:

  • 只需返回该值并在调用站点上分配。
  • 如果它们是 global(在 OO 编程中必须避免的),那么你可以写 gl.att1 = 1。或类似的东西。然后您应该将您的方法3更改为:public void method3( GlobalVariables g){ g.att3 = g.att1 + g.att2; }
  • 这不是一个好主意。请不要进一步采用这种方法,尤其是在您发现反射时。要么将它们公开,要么为每个字段编写 getter 和 setter。
  • 也许,只是也许您在解决问题时采用了错误的方法。很高兴了解您的真正问题(和代码),因此我们可以更好地指导您采用另一种方法。
  • 而且,当然,你可以制作一个setter并传递它(setter方法)

标签: java parameter-passing


【解决方案1】:

使用setter方法:

static void setAtt3(int x) { att3 = x; }

void method3(int a, int b, IntConsumer setter) {
    setter.accept(a + b);
}

呼叫:

method3(att1, att2, GlobalVariables::setAtt3);

【讨论】:

    【解决方案2】:

    如果这些是全局的(在 OO 编程中必须避免的事情),那么您可以只写 gl.att1 = 1

    那么你应该将你的方法3更改为:

    public void method3( GlobalVariables g)
    {
        g.att3 = g.att1 + g.att2;
    }
    

    事实上,这只是解决您的问题,即更改另一个类的对象的值。
    记住您收到的所有 cmets,并尝试一种新的方法来解决您的问题。
    如果您确实需要更改任何属性的值,最好的方法是setter

    根据您的评论,我建议如下:

    public class GlobalVariables {
        private int x3;
        public void method3( int a, int b ) {
            x3 = a + b;
        }
    }
    

    根据需要为您的变量创建 getter 和 setter。如果您需要更新另一个变量,例如 x2,请创建一个新方法来为您执行此操作。
    如果你不这样做,那么你就违反了一些规则。在这种情况下,您正在破坏封装。

    【讨论】:

    • 使用 setter 需要创建 3 个方法,因此在每个方法中我都会更改不同的属性或添加另一个带有字段名称的参数并进行切换,但请记住,这只是一个例如,我拥有的真正方法有更多代码,并且 method3 使用不同的属性组合调用了很多次。
    • 你的意思是void method( int v1, int v2, Object target )?如果是这样,那么您可能以错误的方式执行此操作...即使这是可能的,正如您在另一个答案和 cmets 中看到的那样,请尽量避免这种情况...我会更新我的答案...
    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多