静态方法改变Object的状态

时间:2014-07-02 12:36:32

标签: java oop static static-methods

今天我偶然发现了一个我在项目中看到过的代码,并担心会对此进行调查。我没有意识到为什么他们将这些作为静态方法,因为它们改变了对象的状态。

下面是代码

@Controller
CruiseController{

getCruiseSearchResults(){
//prepare cruise serach request, static method in CruiseHelper
CruiseSearchRequest cruiseReq = CruiseHelper.prepareRequest();
...futher impl      

}

/** my helper class which has utlity methods */
CruiseHelper{
    public static CruiseSearchRequest prepareRequest(){
        CruiseSearchRequest cruiseRequest = new CruiseSearchRequest();

    // all below methods are static
    setCruiseTypeandDestination(cruiseRequest)
    setStartAndEndDate(cruiseRequest)
    setShipAndDeparturePort(cruiseRequest)
    setDurationAndAccesiblity(cruiseRequest)
    setPromoType(cruiseRequest)
    setResultPreferences(cruiseRequest)

    return cruiseSearchCriteriaDTO
}

static void setCruiseTypeandDestination(CruiseSearchRequest cruiseRequest){

    /** changing the state of object in static method */
    cruiseRequest.setCruiseType("ABC");
    cruiseRequest.setCruiseType("Alaska");
}

//.... further static methods as above, all of them 
//change the state of cruiseRequest
}

所以我知道,上面的方法不应该是静态的,因为它们都具有每个请求的属性。但是代码工作正常,并且在执行任何负载测试时都没有失败。

我的重要问题是:"可以考虑以上代码吗?"并且"如果是的话,这会失败吗?然后在什么情况下?"

4 个答案:

答案 0 :(得分:2)

实际上,这些方法会改变对象的状态,但它是一个作为参数给出的对象,这是完全有效且有意义的。

static表示该方法绑定到对象定义(类),而不绑定到任何特定的对象实例。因此静态方法不能更改它自己的对象的状态,因为它根本没有要处理的实例(它没有this)。

我建议您阅读有关静态和类变量的信息:Understanding Class Members

答案 1 :(得分:1)

静态方法用于暗示该方法不需要调用类的实例。例如,考虑String类。它仍然可以改变任何对象的状态。

replaceAll()不是静态方法,因为它需要一个实例来处理。其中valueOf()不是因为它不需要String实例。

我建议你重温Java的基础知识。

答案 2 :(得分:1)

  

我没有意识到为什么他们将这些作为静态方法,因为它们改变了对象的状态。

因为他们是名为CruiseController的类的方法。他们正在修改CruiseSearchRequest的实例,这是一个不同的类。您无法执行cruiseSearchRequest.setCruiseTypeandDestination();,因为方法setCruiseTypeandDestination不在CruiseSearchRequest类上。因此,它接收CruiseSearchRequest对象作为参数,并且因为它不与CruiseController的任何实例绑定,所以它是该类的静态方法。

如果将 移动到CruiseSearchRequest类,则可以使方法非静态。但是,你不需要。在静态方法中修改对象绝对没有技术上的错误。对于您的特定程序,它可能是也可能不是一个好的设计,但它不会失败"。

答案 3 :(得分:0)

Spring中的方法不应该是静态的,因为它们不起作用,但因为它在应用程序体系结构方面是一个糟糕的决定。静态方法在单元测试方面是错误的决定 - 模拟静态方法比对象更难。此外,我认为静态方法的密集使用打破了依赖注入的概念,并且代码变得更加紧密耦合。 Here是一篇关于这个主题的好文章。