2017-04-13 37 views
2

我在类Foo中用方法doSomething()创建了一个foo类的实例。标准惯例是在该类中创建一个类的实例吗?

public class Foo { 
    public void doSomething() { 
     Foo foo1 = new Foo(); 
    } 
} 

这是标准做法吗?这似乎是一个很不寻常的事情。你为什么想要这样做?以这种方式创建代码是否存在危险?你是否有理由这样做,而不是使用其他一些做法?最后,我的直觉是任何做这种事情的方法都应该被声明为静态的。那是对的吗?

+0

恕我直言,这不是,是非常罕见的(除非该方法是静态的)。 –

回答

5

是的,这是标准做法。这不是常见(在实例方法中,更常见于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指出:toUpperCasesubstring,...

+0

@JornVernee:LOL - 我在发帖之后想到了第二个不变性,并添加了它,参见上文。 :-) –

+0

或RecursiveTask :) – HRgiger

+1

字符串将是一个很好的例子。 trim()和subString(...)和东西返回新的字符串。 – 5tingr4y

1

是,没关系。一个很好的例子是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

很好的例子。 .. –

相关问题