Java 编程技术:将对象或值作为方法参数传递

Java 编程技术:将对象或值作为方法参数传递,java,oop,parameter-passing,Java,Oop,Parameter Passing,传递参数在日常编程中很常见,但我们应该将参数作为对象或值传递吗 (A) (B) 根据OOP的概念,我们应该使用对象。但是,不要过度使用它。例如,在您的示例中,我会使用int。但如果我在很多地方使用多个值,我会使用一个对象。 我不会仅仅用一个数据成员“amount”创建一个Payment类 使用适当的OOP,您将在付款对象上拥有大于零的权限,即: class Payment { int amount public boolean isGreaterThanZero() { retu

传递参数在日常编程中很常见,但我们应该将参数作为对象或值传递吗

(A)

(B)


根据OOP的概念,我们应该使用
对象
。但是,不要过度使用它。例如,在您的示例中,我会使用
int
。但如果我在很多地方使用多个值,我会使用一个对象。
我不会仅仅用一个数据成员“
amount
”创建一个
Payment

使用适当的OOP,您将在付款对象上拥有大于零的权限,即:

class Payment {
  int amount
  public boolean isGreaterThanZero() {
    return amount > 0
  }
}
然后:

Payment payment
boolean flag = payment.isGreaterThanZero()

我的目标是保持事物的解耦。如果isGreaterThanZero()真正需要的是金额,那么int版本更好,因为它不会将实现与Payment类耦合。

这是一个人为的示例,但是如果这是接收类与Payment的唯一交互,我会为了解耦而使用该值。创建多余的类依赖项没有意义


编辑:Marcel和我在同一时间输入了相同的内容。:)这。

这个问题的答案将针对特定的情况,因此无法给出明确的答案,但何时使用哪种方法仍然有效

我会在以下情况下传递对象:

  • 该方法需要处理从外部传入的大量数据。最好将这些参数包装到对象中,因为这样做意味着您可以让方法获取一个参数,而不是每个数据值1个参数。您还可以将参数验证逻辑重新考虑到包装器类中,以获得更好的局部性。1
  • 在整个API中经常使用相同的参数组合时

  • 当参数很少时,我会传递一个值,并且所有参数都是简单的值类型。

    我认为我们应该尽可能使用基本类型(int、double、boolean、char)作为参数,因为存在基本类型并非偶然。我更喜欢第二个选项,因为它更通用(它不会强迫您提供支付对象,任何int值都可以)。但是,当您需要对象的状态(对象数据的至少两个值)时,情况可能会发生变化,您可以使用值作为参数以实现更一般的使用可能性,也可以使用对象作为参数以简化操作。

    假设您问的是参数传递,而不是对象设计

    在设计方法时需要考虑多个方面。

  • 这种方法可以在其他地方使用吗?在你的例子中,答案可能是肯定的——它可以判断任何int是否大于零——在这种情况下(B)更有用
  • 如果该方法需要多个参数,并且特定于代码中的某个对象,则传递该对象

  • 在有意义的地方,尽量减少代码中模块之间的依赖关系。在您的示例中,(A)引入了对支付对象不必要的依赖。但是,如果该方法需要支付对象的两个成员变量(因为它是特定于支付的),那么无论如何,将支付对象作为参数传递。

    有时,将对象地址(或指针、句柄,无论您如何称呼它)作为参数传递,然后在方法中强制转换它(作为所需对象的实例)比将对象作为参数传递更快。这只是一种限制编译方式的方法。如果有时它不会改变任何东西,在其他情况下,传递地址会使程序更快。这是一种低级编译器功能,但确实可以使代码更快。

    我前面的答案是addnum。这还取决于compiler优化和方法调用上下文。如果对象在方法调用之前已经定义,或者如果它是一个可以从内联和优化中获益的方法,那么使用ADRES不是一个好主意。 如果您处于循环中,那么最好使用地址。
    您必须考虑一下该方法将如何在特定程序中使用(=预计它将如何编译)。

    是的,我们可以在Java程序中将对象作为参数传递。

    第一条路

    第二条路
    您好,假设这是一个业务逻辑,用于检查银行帐户是否有足够的取款金额。我不同意在系统的模型层中编写业务逻辑。如果它严格与一个域对象一起工作,并且不受任何其他影响,则它属于域对象。您还会将该方法放在哪里。在服务中esn没有意义,因为它不仅限于服务。在实用程序类中是不正确的,因为静态实用程序不是好的OOP(有时是必要的,但不是理想的选择)在本例中,该方法被赋予一个对象,并通过调用该对象上的方法返回一个答案。没有使用任何其他方法…因此它属于该对象。但该方法看起来像一个通用方法。我们很可能在一个Util类中有一个静态方法来进行泛型比较。您对此有何想法?嗨,这是唯一的你可以举一个简单的例子来回答我的问题。=)嗨,你能再详细说明一下吗。如果有太多的参数要传递给方法,我想最好将它们封装在一个对象和进程中。@liangteh当然。你有没有什么特别的部分需要我详细说明?+1用于封装“太多的参数”。绝对是一种代码味道。我同意SlippedSmurf的观点,在理想情况下,你将拥有所有的基本类型(或者更好的是,根本没有参数),但有时它根本没有意义——没关系,只要确保方法和对象之间的“耦合”是逻辑的。你在说什么语言?在Java中,总是传入对对象的引用,而不是对象本身。你说的是传递对象副本而不是对象副本的语言吗
    class Payment {
      int amount
      public boolean isGreaterThanZero() {
        return amount > 0
      }
    }
    
    Payment payment
    boolean flag = payment.isGreaterThanZero()
    
         class demo
         {private int length=1;
          private int breadth=1;
          private int area;
          void input(int length,int breadth)
          {
             this.length=length;
             this.breadth=breadth;
          }
          void add(demo d1,demo d2)
          {
              length=d1.length+d2.length;
             breadth=d1.breadth+d2.breadth;
          }
         void output()
         {
             System.out.println("\nLength="+length+"\nBreadth="+breadth);
         }
    
            public static  void main(String args[])
            {
    
                demo d1=new demo();
                demo d2=new demo();
                d1.input(1, 1);
                d1.output();
                d2.input(2, 2);
                d2.output();
                demo d3=new demo();
                d3.add(d1, d2);
                d3.output();
    
            }
    
         }
    

         class demo
         {private int length;
          private int breadth;
    
          void input(int length,int breadth)
          {
             this.length=length;
             this.breadth=breadth;
          }
         demo add(demo d2)
          { demo obj=new demo();//Neccesary as we want to return complete  
                                         object irrespective of its number of data fields
              obj.length=length+d2.length;//Storing the length of two objects  
                                                         in the obj 
             obj.breadth=breadth+d2.breadth;
             return obj;
          }
         void output()
         {
             System.out.println("\nLength="+length+"\nBreadth="+breadth);
         }
    
            public static  void main(String args[])
            {
    
                demo d1=new demo();
                demo d2=new demo();
                d1.input(1, 1);
                d2.input(2, 2);
                demo d3=d1.add(d2);//Here we created new object d3 called  
                                             add() by d1 and passed d2 object through it 
                d3.output();
    
            }
    
         }