今天我偶然发现了一个我在项目中看到过的代码,并担心会对此进行调查。我没有意识到为什么他们将这些作为静态方法,因为它们改变了对象的状态。
下面是代码
@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
}
所以我知道,上面的方法不应该是静态的,因为它们都具有每个请求的属性。但是代码工作正常,并且在执行任何负载测试时都没有失败。
我的重要问题是:"可以考虑以上代码吗?"并且"如果是的话,这会失败吗?然后在什么情况下?"
答案 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是一篇关于这个主题的好文章。