想问一个静态属性的问题,请大神解答?

我们使用的是jfinal 2.2.业务代码有两种写法,请大神解答下 这两种的区别。

第一种:

1.一个工具类 去new 所有的服务类。

public class CommonFactory()

{

//A和b的service 调用dao层方法,每次实例化dao层对象进行调用。

private static AService a=enhance(Aservice.class);

private static BService b=enhance(Aservice.class);

    public static getAService()   {

      return a;    }

    public static getBService()   {

      return b;    }

]

//Aservice 服务层方法

public class Aservice()

{

public void  save(Amodel a)

a.save();

}

public class IndexController extends Controller {

public void save()

{

   CommonFactory.getAService().save();

}

}

以上是第一种的伪代码。一个统一的服务工具类,静态的new出对象,然后在控制器中直接通过服务的工具类调用具体的方法。

第二种:

public class Aservice()

{

public void save(){

    Amodel a=new Amodel();

a.save();

}

}

public class IndexController extends Controller {

public void save()

{

Aservice aservice=  enhance(Aservice.class);

   aservice.save();

}

}


这两种写法有什么区别?第一种写法有什么问题? 求大神解答

评论区

JFinal

2017-04-13 12:36

第一种比较绕,比较麻烦而已,没有本质的区别,都是创对象,只是创建的地点不同

芒果过敏

2017-04-13 12:54

@JFinal @JFinal 1.你说的线程安全问题应该注意哪些部分?比如service层有个局部变量之类的。2.如果同样100万的访问量。性能上哪个更高些?

jounzhang

2017-04-13 13:41

个人觉得jfinal的方式简单好用明了容易理解:
public class ADao{
public static final ADao me = new ADao();
public void save(){
...
}
}

public class AService{
public static final AService me = new AService();
public void save(o){
ADao.me.save(o);
}
}

public class AController{
public void save(){
AService.me.save(xxxx);
}
}

这种方式还可以采用spring来进行管理,耦合度也低。

JFinal

2017-04-13 14:34

@芒果过敏 只要是多线程可以同时访问的对象就要注意线程安全,是你的代码中有 static,表明有对象是全局共享的,不仅这个 static 声明的对象要注意线程安全,而且这种共享可以像链条一样一直传递下去

性能方面几乎没有差别多调一层方法而已

JFinal

2017-04-13 14:35

线程安全是基础知识,一定要搞清楚,否则程序会出现不确定的错误

芒果过敏

2017-04-13 14:43

@JFinal 第一种方式,Aservice中Amodel a1= new Amodel() 这个a1也是共享的?

JFinal

2017-04-13 14:44

@芒果过敏 没用 static 就不是多线程共享

芒果过敏

2017-04-13 15:00

@JFinal 就是第一种方式 虽然Aservice是static的,但是Aservice中的Amodel是new 出来的,所以不是共享的。对吧? 如果 Amodel 在Aservice中是 全局的static变量 就要考虑多线程共享了吧