2014-09-04 98 views
0

我真的很困惑这个代码,我想完成。这里是它的一个片段:Java - 将其类作为返回类型的方法?

public class PuzzleStateSimple implements PuzzleState { 

    public PuzzleState moveUp() { 
    return null; 
    } 

    public int[] getStateArray() { 

    } 

} 

我不明白这是怎么回事。我想回到课堂上吗?或者我建造一个新的PuzzleStateSimple对象并返回它?这个类看起来不像它是用Singleton模式设计的。

下面是使用这种类测试用例的一个片段:

public void testMoveUp(){ 
    // 2 8 3 2 0 3 
    // 1 0 4 -> 1 8 4 
    // 7 6 5 7 6 5 
    PuzzleState start = createPuzzleState(puzzleCenterPosition.clone()) ; 
    PuzzleState goal = createPuzzleState(puzzleFirstRowMiddlePosition2.clone()) ; // note: 2 puzzles of that kind, 2nd one is it 

    PuzzleState result = start.moveUp(); 
    assertTrue("Expected" + printPuzzle(goal.getStateArray()) + ", computed: " + printPuzzle(result.getStateArray()), 
       goal.isEqual(result)); 
    } 

预先感谢。

+4

,你必须回答的问题:这是一个**工厂方法**(在方法链接使用)或者是PuzzleState **不可变类型**? Google是你的朋友,除非你知道答案,否则我不会阅读任何答案,因为发布答案的人会在其他答案出现时假设一个。 – 2014-09-04 17:17:56

+0

@KevinWorkman我不认为这个类是一个工厂方法。我不认为PuzzleState是不可变的类型,因为有另一种方法叫做'int [] getStateArray''。所以我认为作者不打算让这个PuzzleState数据类型是不可变的。 – mrQWERTY 2014-09-04 17:21:25

+0

那么,从类似方法返回自己的类型的唯一原因通常是工厂/链接方法或不可变类型。这可能是一个或另一个,问题的答案取决于它是哪一个。这里不只有一个正确的答案,这完全取决于代码应该做什么。 – 2014-09-04 17:23:21

回答

0
public PuzzleState moveUp() { 
    return null; 
    } 
在此签名

,预计回报PuzzleState类型的实例(不Class类型的实例),看着似乎方法需要perocess一些变化实例的内部状态,并返回同一个实例回即return this;冠名

1

返回类的实例的非静态方法通常在对其状态进行一些处理后返回this。他们的目的是让调用,如链接:

PuzzleState obj = new PuzzleState(); 
obj.moveUp().moveRight().moveUp(); 

其他可能使用这种方法是返回他们呼吁该实例的副本。

最后,有工厂方法,通常是静态的,并返回类的新实例。但是,工厂方法有时在单独的工厂类中声明,而不是在它们生成的实例的同一类中。

+0

可能还想考虑返回新实例的不可变类型。 – 2014-09-04 17:17:48

+0

@SotiriosDelimanolis你是对的。起初我以为只有静态方法会返回新的实例,但是像clone()这样的非静态方法也可以返回一个新的实例。 – Eran 2014-09-04 17:19:42

0

如果这应该是一个不可变对象:

public class PuzzleStateSimple implements PuzzleState { 

    final public int x; 
    final public int y; 

    public PuzzleStateSimple(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public PuzzleState moveUp() { 
     return new PuzzleStateSimple(x, y-1); 
    } 

} 

这允许方法链接:PuzzleState newState = currentState.moveUp().moveUp();

+0

这段代码不会编译,再加上做别人的作业并不酷。 – 2014-09-04 17:39:21

+0

@KevinWorkman第一:我不在乎这是否是功课。第二:这是可编译的(如果PuzzleState存在,当然)。 – 2014-09-04 17:48:34

+0

@DávidHorváth通常,我们尽量不要在家庭作业上转储完整代码解决方案,因为它会消除解决问题的过程,这是尝试在此教授的真正教训。你只是编辑你的代码,以便编译它,但它展现的行为是不正确的。 – 2014-09-04 17:50:14

相关问题