标准惯例是在该类中创建一个类的实例吗?
问题描述:
我在类Foo中用方法doSomething()创建了一个foo类的实例。标准惯例是在该类中创建一个类的实例吗?
public class Foo {
public void doSomething() {
Foo foo1 = new Foo();
}
}
这是标准做法吗?这似乎是一个很不寻常的事情。你为什么想要这样做?以这种方式创建代码是否存在危险?你是否有理由这样做,而不是使用其他一些做法?最后,我的直觉是任何做这种事情的方法都应该被声明为静态的。那是对的吗?
答
是的,这是标准做法。这不是常见(在实例方法中,更常见于static
s),但它是完全标准的。
Foo
中的代码在很大程度上是无关紧要的:如果代码由于某种原因需要Foo
以外的其他实例,则创建实例并使用它是非常正常的。
这不是真的比任何一个创建不同类的两个实例的方法更奇:
class Foo {
void method() {
Bar b1 = new Bar();
Bar b2 = new Bar();
// ...
}
}
据推测,method
需求都Bar
实例。同样,doSomething
显然需要Foo
而不是this
。
你特别看到的一个地方是具有流畅接口的不可变对象,其中大多数方法都会返回对象的一个实例,并改变了某些方面。
public class Thingy {
private int a;
private int b;
public Thingy(a, b) {
this.a = a;
this.b = b;
}
public Thingy withA(int newA) {
return new Thingy(newA, this.b);
}
public Thingy withB(int newB) {
return new Thingy(this.a, newB);
}
public int getA() {
return this.a;
}
public int getB() {
return this.b;
}
// ...
}
通常withX
方法比这更有趣,但你的想法... String
就是这样的一个例子,作为5tingr4y指出:toUpperCase
,substring
,...
答
是,没关系。一个很好的例子是binary tree,它(通常)创建子节点的父节点内增长:
class Node {
Node left, right;
int value;
Node (int i) {
value = i;
}
void add(int i) {
if (i < value)
left = new Node(i); // must create Nodes within Nodes
else
right = new Node(i); // must create Nodes within Nodes
}
+0
很好的例子。 .. –
恕我直言,这不是,是非常罕见的(除非该方法是静态的)。 –