关于java一些潜移默化的规则

从学习Java到工作已经一年多了,现在想起来,仍然是小小的脑袋里有大大的疑惑,记得学习培训的时候,讲到spring,大家都说不被controller调用的方法,只在server层内部的方法要用private,最近带别人也这么教被问为什么,我也想不明白为什么,如果都写public会有什么问题嘛?我怎么也想不到有什么问题,又不是静态方法,server层的抽象类又不写,实现类写了能暴露给谁用。

阅读 1.9k
2 个回答

这不是习惯,也不是什么潜移默化。
而是一种最佳实践,真正去理解封装,抽象的概念就很容易解释这种行为。

对于crud的常规操作,你举的例子可能不会有问题,大概率没人会去调用。因为理想情况下,大家都是这样从spring容器里面拿对象的

// IUser是接口类,有方法add,他有唯一实现类User 有public方法create
@Autowired
private IUser user;  

这个时候直接调用方法比如

user.add(1);

ok没问题。
但是如果有人这样写呢?

@Autowired
private User user;  //同样是注入User对象,但是不使用多态特性

private void test(){
  
  user.create(1); //注意此时create可以直接调用。其实你本意是让他调用add方法,但是这位同学不关注你的实现和细节,他想要加一个值,刚好有create,他就用了。
  
}

这只是一个很浅显的例子,其实还是很多种常见下可能会出现问题,在设计一些较为复杂的功能时候,我们我们会对一个接口有多个实现类,每个实现类又可能实现了其他的多个接口,调用者需要根据场景来判断实现类,强转实现类类似PasswordToken passwordToken=(PasswordToken)token;
这个时候接口根本不能约束调用者调用非法或者非安全方法。

楼上的答案会误导新手而且错误,不是看个人习惯。是必须考虑封装,考虑健壮性,尽量在满足功能和扩展性的前提下使用较小的作用域

这应该属于一种习惯了吧,类似于我就习惯将只在service内部调用的方法写成private。

讲道理,写成public并没有什么不对,毕竟在spring中不会使用具体的实现类来调用方法。但仔细考虑一下,如果你写成private,在维护时看到这个方法为private,就可以随意的改动。因为你知道这是一个只在内部调用的类,而不需要担心改了他之后影响到controller或者接口等等。

所以我也建议写成private,但还是看个人习惯。就像js一样,语法写法有很多种,加;号不加;号,lambda加()不加()。实际上都是一种习惯了吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题