Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 作为参数传递或创建实例。哪一个是好的编程实践?_Java_Parameter Passing_Instance - Fatal编程技术网

Java 作为参数传递或创建实例。哪一个是好的编程实践?

Java 作为参数传递或创建实例。哪一个是好的编程实践?,java,parameter-passing,instance,Java,Parameter Passing,Instance,我有A类,需要将对象obj传递给B类中的函数func2。B类的func2中需要obj class A { Object obj; . . public void func1() { B b = new B(obj); b.func2(); } } 或 我仅在func2中使用obj在B类中。 将obj作为参数传递给func2,或者在类B中创建Object的实例,并在类B的构造函数中初始化Object,这是一种很好的编程实践。或者使用这

我有
A类
,需要将
对象obj
传递给
B类
中的
函数func2
。B类的
func2
中需要
obj

class A {
   Object obj;
   .
   .
   public void func1() {
        B b = new B(obj);
        b.func2();
   }
}

我仅在
func2
中使用
obj
B类
中。 将
obj
作为参数传递给
func2
,或者在类B中创建
Object
的实例,并在类B的构造函数中初始化
Object
,这是一种很好的编程实践。或者使用这两种方法都没有区别? 感谢您对此的任何意见

更新


为了澄清我的用例,
Class A
配置
HttpClient
,并将
HttpClient
的实例传递给
Class B
<类中的code>func2执行
HttpRequest
并返回响应。是否需要将
HttpClient
作为实例变量维护在
Class B
中,或者将其作为参数传递给
func2
。是的,我必须根据设计每次在
func1
中创建
B
的新实例。

由于您仅在func2中使用obj,我建议将其作为参数传递给方法。这将允许更快地对对象进行垃圾收集,而不是等待B被销毁。但是,如果频繁使用该方法,则可能会降低性能。根据所提供的信息是无法判断的


您可以在项目中使用基准测试来测试性能并比较这两种方法。

构造函数用于初始化类的字段,因此如果您将
obj
传递给类
B
的构造函数,则
obj
应该是类B内的字段,即。,
obj
维护与
B
的HAS-A关系

您提到的另一种情况是,当您将
obj
作为方法(如
func2
)参数传递时,通常在
func2
计算中使用它

因此,您需要检查
obj
作为类B的字段是否有意义,以便它可以作为构造函数的一部分进行初始化。因此,这完全取决于类
B
的设计


另外,要回答您的问题,只需考虑在面向对象的世界中
obj
类B
之间的关系,更重要的是,如果您选择
A
B
、obj等类,则考虑。。您无法轻松应用/理解面向对象的概念<更确切地说,请考虑真实世界类和对象<强> > <代码>类银行帐户< /代码>或<代码>类产品< /代码>或<代码>类机器< /代码>等。

完全取决于是否需要<代码> Obj/<代码>,或者仅在代码< >函数2>(< /代码>)期间关心它。它在逻辑上是否是
B
状态的一部分?您是否可以在同一个实例上多次调用
func2
,并为其提供不同的对象以供使用?这个问题太模糊了,现在还不能回答。@azurefrog:我只在func2期间需要它。这就是我所说的“我只在func2中使用了类B中的obj”。@JonSkeet:对于
A
的实例,我只会有一个
B
的实例,并调用一个
func2
。这就是为什么我没有提到多个电话的原因。如果您需要更多信息,请告诉我。它仍然非常模糊,因为我们不知道它是否在逻辑上是B状态的一部分。它是上下文敏感的,并且您没有提供任何上下文。我非常怀疑你的类实际上是A和B,或者你的方法叫做func2。实名将提供有关上下文的信息…JVM自动处理垃圾收集。感谢您的回复。你是在用描述性的方式提出我的问题。因为问题是哪种方法更好,而您正在解释我在
B类
中需要做什么,这取决于我选择的方法。而
B类
的设计并不取决于如何获得
obj
,因为它只在
func2
中使用,而且只使用一次。我希望问题现在更清楚了。同样,这个问题的答案是,只要考虑一下在面向对象的世界中
obj
class B
之间的关系,同样,如果你使用像A、B、obj等一般类的话。。你不容易理解这个概念。相反,以现实世界中的类和对象为例。如果这有帮助,您可以接受我的答案,并用我的用例更新问题。还有什么理由吗?
class A {
   Object obj;
   .
   .
   public void func1() {
        B b = new B();
        b.func2(obj);
   }
}