1. 参考阿里Java规范文档

  2. 不建议使用过时方法

  3. 泛型需要加上<>,这种方式创建的对象是不推荐的。

Map object = new HashMap();//禁止使用
  1. 字符串比较时,不需要大小写时,使用equalsIgnore方法,不使用toUppers方法
str.equals(string.toUppers());//不推荐使用
str.equalsIgnore(string);//推荐使用
  1. Integer很多时候没有必须要.intValue()方法,在使用Intger或者int时,不需要使用Integer,valueof(i)进行强制转化,java内部会进行自动拆箱和装箱
Integer.parseInt(str); //推荐使用
Integer,valueof(str);//不推荐使用
  1. 尽量使用StringBuilder来替换StringBuffer,在使用线程的时候除外。

  2. logger方式内部不建议用+进行拼接,而使用字符串中带{}的方式,也不需要进行isDebug的方式进行判断,在使用{}语法之后,JVM执行到这时不会进行字符串拼接,logger会自动进行识别某个日志级别是否开启。使用log4j2

logger.info("{}",str);
  1. 使用了StringBuilder之后,就不需要使用+在继续拼接了。
StringBuilder builder = new StringBuilder();
builder.append("hello" + kitty); //禁止使用
builder.append("hello").append("kitty");//推荐使用
  1. 程序必须要异常拦截,方法内部处理异常,必须要打印异常日志
try{

  }catch(Exception e){
//什么都不做 // 不推荐
logger.error("{}",e);//推荐异常日志打印出来
}
  1. Spring拦截,统一处理空格(需要封装request)
@Configuration
public class HttpFilter implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
WebServletRequestWrapper wrapperRequest = null;
if (servletRequest instanceof HttpServletRequest) {
wrapperRequest = new WebServletRequestWrapper((HttpServletRequest) servletRequest);
}
if (wrapperRequest == null) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
filterChain.doFilter(wrapperRequest, servletResponse);
}
} @Override
public void destroy() { }
} public class WebServletRequestWrapper extends HttpServletRequestWrapper { private Map<String, String[]> params = new HashMap<String, String[]>(); private final String body; public WebServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
body = inputStreamBody(request);
//处理参数
Map<String, String[]> parameterMap = request.getParameterMap();
this.params.putAll(parameterMap);
this.modifyParameterValues(); } @Override
public ServletInputStream getInputStream() throws IOException {
//将input流封装一次
final ByteArrayInputStream byteArrayInputStream =
new ByteArrayInputStream(body.getBytes("utf-8"));
DelegatingServletInputStream delegatingServletInputStream = new DelegatingServletInputStream(
byteArrayInputStream);
//非json类型,直接返回
if (!super.getHeader(HttpHeaders.CONTENT_TYPE)
.equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)) {
return delegatingServletInputStream;
}
//为空,直接返回
if (StringUtils.isEmpty(body)) {
return delegatingServletInputStream;
}
Map<String, String> map = new HashMap<>();
json2Map(map, body);
return new DelegatingServletInputStream(
new ByteArrayInputStream(JSON.toJSONString(map).getBytes("utf-8")));
} @Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream(), "UTF-8"));
} public String getBody() {
return this.body;
} /**
* 将parameter的值去除空格后重写回去
*/
public void modifyParameterValues() {
Iterator<Entry<String, String[]>> it = params.entrySet().iterator();
while (it.hasNext()) {
Entry<String, String[]> entry = it.next();
String key = entry.getKey();
String[] values = entry.getValue();
values[0] = values[0].trim();
params.put(key, values);
}
} /**
* 重写getParameter 参数从当前类中的map获取
*/
@Override
public String getParameter(String name) {
String[] values = params.get(name);
if (values == null || values.length == 0) {
return null;
}
return values[0];
} @Override
public String[] getParameterValues(String name) {//同上
return params.get(name);
} @Override
public Map<String, String[]> getParameterMap() {
return this.params;
} /**
* 转化body
*/
public String inputStreamBody(HttpServletRequest request) throws IOException {
StringBuffer stringBuilder = new StringBuffer();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
return stringBuilder.toString();
} /**
* 将json字符串转化为Map,并去除掉值的空格
*/
public static void json2Map(Map<String, String> map, String json) {
JSONObject object = JSONObject.parseObject(json);
Set set = object.keySet();
for (Object o : set) {
String key = (String) o;
String s = object.getString(key);
if (s.indexOf('{') == 0 && s.lastIndexOf('}') == s.length() - 1) {//对象.
JSONObject oo = fromObject(s);
if (oo == null) {
map.put(key, s.trim());
} else {
json2Map(map, s);
}
} else {
map.put(key, s.trim());
}
}
} /**
* 将json字符串转化为JSONObject,异常返回null
*/
public static JSONObject fromObject(String jsonStr) {
return JSONObject.parseObject(jsonStr);
}
}
  1. 每个web请求输入和输出打印(Spring 切面)
@Aspect
@Component(value = "lmsControllerInterceptor")
public class ControllerInterceptor { private static final Logger logger = LoggerFactory.getLogger(ControllerInterceptor.class); @Pointcut("execution(* com.cootf.resim.lms.web.controller.*..*(..))")
public void methodPointcut() { } @AfterThrowing(pointcut = "methodPointcut()", throwing = "e")
public void doThrowingAfterMethodPointcut(JoinPoint jp, Throwable e) {
logger.error("exception: {}", MiscUtil.trace(e));
} @SuppressWarnings("unchecked")
@Around("methodPointcut()")
public Object aroundMethodPointcut(ProceedingJoinPoint pjp) {
Object result = null;
long startTime = System.currentTimeMillis();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
if (attributes == null) {
return result;
}
WebServletRequestWrapper request = (WebServletRequestWrapper) attributes.getRequest();//封装了流
String method = request.getMethod();
String uri = request.getRequestURI();
long endTime;
//获取参数
Map<String, String> paramMap = new HashMap<>();
Enumeration<String> paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = paramNames.nextElement();
String valueStr = request.getParameter(paramName);
paramMap.put(paramName, valueStr);
}
logger.info("request start,uri: {},method: {},req: {},body:{}", uri, method, paramMap,
request.getBody().replaceAll("\\r|\\n", ""));
try {
result = pjp.proceed();
endTime = System.currentTimeMillis();
logger.info("request end,elap: {}ms,uri: {},method: {},rsp: {}", (endTime - startTime), uri,
method, MiscUtil.obj2Json(result)); } catch (Throwable throwable) {
endTime = System.currentTimeMillis();
logger
.error("request end,elap: {}ms,uri: {},method: {},e: {}", (endTime - startTime),
uri, method, MiscUtil.trace(throwable));
return Rsp.transEnd(RpcFailReasonEnum.ERR_SYSTEM_ERROR.getCode(),
RpcFailReasonEnum.ERR_SYSTEM_ERROR.getDesc());
}
return result;
}
}
  1. 参数需要校验, 使用Hibernate-validate框架,每个请求都创建实体,注解式的参数校验。
  2. 出现两次以上的代码块需要抽离单独的方法。
  3. idea中置灰的代码删除
  4. resutful风格的路径,都必须要小写
@PostMapping("/device/new") // 添加设备接口
  1. 每个接口或方法(接口的实现除外)都需要有一个简短的中文注释
 /**
* 通过电话号码查询用户
*/
Custom selectCustom(String phoneNumber);
  1. 不同层的方法开头规则
  • DAO层 方法以select开头。 selectUserInfo(); insert,update,delete(即mysql使用的关键词)
  • Service和Controller层方法queryUserInfo(),saveUserInfo(),editUserInfo(),deleteUserInfo()
  • 数据库映射实体 后缀entity UserEntity
  • controller 返回实体后缀Rsp UserRsp
  • 参数校验实体 UserVo
  1. 部署需要写脚本,或者是利用框架,实现自动化
  2. 状态等类型必须使用枚举类型或者是单独一个类的实体的静态变量
public enum UserEnum{

    ENABLE(0,"启用"),
DISABLE(1,"禁止");
private int code;
private String desc;
UserEnum(int code,String desc){
this.code = code;
this.desc = desc;
}
public int getCode(){
return this.code;
}
public String desc(){
return this.desc;
}
} public class Constant{
public static final int ENABLE = 0;//启用
public static final int DISABLE = 1;//禁止
···
}
  1. if 嵌套不能超过三层,多使用if(){return;}
if(参数不正确){
return "返回参数不正确";
}
if(用户没有找到){
return "用户没有找到";
}

这个是自己最近总结的Java规范文档,在看别人代码并且对照自己编码习惯,总结以上几点。 以上有几点是关于web程序的建议。

代码一定要规范起来,这样自己再看自己的代码时,就可以形成一个固定的格式,很容易就能够理解,其他人在看自己的代码时,也能够清晰。写代码不仅仅让自己能够看得懂,而且还能够让其他人看的懂,需要有一个良好的编码习惯。

自己的Java规范文档的更多相关文章

  1. JVM 内部原理(五)— 基本概念之 Java 虚拟机官方规范文档,第 7 版

    JVM 内部原理(五)- 基本概念之 Java 虚拟机官方规范文档,第 7 版 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - J ...

  2. 【转载】WEB前端开发规范文档

    本文转载自谈笑涧<WEB前端开发规范文档> 为 新项目写的一份规范文档, 分享给大家. 我想前端开发过程中, 无论是团队开发, 还是单兵做站, 有一份开发文档做规范, 对开发工作都是很有益 ...

  3. 还在手工制作APP规范文档?这款设计神器你不容错过

    之前写了一些关于APP原型文档的文章:一款APP的交互文档从撰写到交付 这次想写下关于APP设计规范文档的内容,规范文档这个东西,实际上大部分中小型公司没有这方面的需求,也没精力去制作这样一个系统性的 ...

  4. Java代码规范文档

    NOTE:以下部分为一个简要的编码规范,更多规范请参考 ORACLE 官方文档. 地址:http://www.oracle.com/technetwork/java/codeconventions-1 ...

  5. 2.SDL规范文档

    01.安全设计Checklist 输入验证 校验跨信任边界传递的不可信数据(策略检查数据合法性,含白名单机制等)格式化字符串时,依然要检验用户输入的合法性,避免可造成系统信息泄露或者拒绝服务 禁止向J ...

  6. Redis 基本安全规范文档

    温馨提示:我在一家手游的公司工作,因为经常用到redis,特为此整理文档(借鉴过大神的文章): 一.什么是redis(出自百度百科)? redis是一个key-value存储系统.和Memcached ...

  7. Web前端开发规范文档

    Web前端开发规范文档 规范目的: 使开发流程更加规范化. 通用规范: TAB键用两个空格代替(windos下tab键占四个空格,linux下TAB键占八个空格). CSS样式属性或者JAVASCRI ...

  8. 【转载】开发备必:WEB前端开发规范文档

    规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必 须按本文档规范进行前台页面开发. 本文档如有不对或者 ...

  9. iOS代码规范文档

    文件命名规范: 1. 项目统一使用类前缀ZY. 2. 分类命名+后面统一使用ZYExtension,例:NSDictionary+ZYExtension.h,常用分类定义在内部并写好文档注释.如果功能 ...

随机推荐

  1. requests接口测试——身份认证

    当调用者访问接口时需要进行用户认证(用户名密码的登录),只有通过了认证才允许调用者访问接口. 1.基本身份认证 许多要求身份认证的web服务都接受HTTP Basic Auth.这是最简单的一种身份认 ...

  2. js字符转换为数字

    转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类 ...

  3. 发布spring jar包, 报错

    org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Una ...

  4. VML元素的相关资料

    虽然VML已经过气了,但有时我还不得不使用它,下面是我收集或研究得到的一些东西. 判定一个元素是否为VML元素 function isVML(el) { if (el && el.no ...

  5. kubelet disk 压力

    systemctl stop docker mv /var/lib/docker /data/lib ln -s /data/lib/docker /var/lib/docker systemctl ...

  6. Redis 字典的实现

    [Redis 字典的实现] 注意 dict 类型使用了两个指针,分别指向两个哈希表. 其中, 0 号哈希表(ht[0])是字典主要使用的哈希表, 而 1 号哈希表(ht[1])则只有在程序对 0 号哈 ...

  7. LevelDB 读取记录

    [LevelDB 读取记录] LevelDb是针对大规模Key/Value数据的单机存储库,从应用的角度来看,LevelDb就是一个存储工具.而作为称职的存储工具,常见的调用接口无非是新增KV,删除K ...

  8. Graphics.Blit

    [Graphics.Blit] 需求注意第4个参数,用4个参数pass用于指定使用哪一个pass.默认值为-1,即使用所有的pass. 参考:file:///C:/Program%20Files%20 ...

  9. Kafka命令行常用命令说明

    基于0.8.0版本. ##查看topic分布情况kafka-list-topic.sh bin/kafka-list-topic.sh --zookeeper 192.168.197.170:2181 ...

  10. Cplus Overolad new and delete Operator

    思考:在C++类中,通过设计类的构造和析构函数,就已经把复杂的内存管理起来了. 及时是简单的结构体,也是有构造和析构函数的,而下面这种情况,可以在非结构中使用. /** Operator Overlo ...