自己的Java规范文档
参考阿里Java规范文档
不建议使用过时方法
泛型需要加上<>,这种方式创建的对象是不推荐的。
Map object = new HashMap();//禁止使用
- 字符串比较时,不需要大小写时,使用equalsIgnore方法,不使用toUppers方法
str.equals(string.toUppers());//不推荐使用
str.equalsIgnore(string);//推荐使用
- Integer很多时候没有必须要.intValue()方法,在使用Intger或者int时,不需要使用Integer,valueof(i)进行强制转化,java内部会进行自动拆箱和装箱
Integer.parseInt(str); //推荐使用
Integer,valueof(str);//不推荐使用
尽量使用StringBuilder来替换StringBuffer,在使用线程的时候除外。
logger方式内部不建议用+进行拼接,而使用字符串中带{}的方式,也不需要进行isDebug的方式进行判断,在使用{}语法之后,JVM执行到这时不会进行字符串拼接,logger会自动进行识别某个日志级别是否开启。使用log4j2
logger.info("{}",str);
- 使用了StringBuilder之后,就不需要使用+在继续拼接了。
StringBuilder builder = new StringBuilder();
builder.append("hello" + kitty); //禁止使用
builder.append("hello").append("kitty");//推荐使用
- 程序必须要异常拦截,方法内部处理异常,必须要打印异常日志
try{
}catch(Exception e){
//什么都不做 // 不推荐
logger.error("{}",e);//推荐异常日志打印出来
}
- 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);
}
}
- 每个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;
}
}
- 参数需要校验, 使用Hibernate-validate框架,每个请求都创建实体,注解式的参数校验。
- 出现两次以上的代码块需要抽离单独的方法。
- idea中置灰的代码删除
- resutful风格的路径,都必须要小写
@PostMapping("/device/new") // 添加设备接口
- 每个接口或方法(接口的实现除外)都需要有一个简短的中文注释
/**
* 通过电话号码查询用户
*/
Custom selectCustom(String phoneNumber);
- 不同层的方法开头规则
- DAO层 方法以select开头。 selectUserInfo(); insert,update,delete(即mysql使用的关键词)
- Service和Controller层方法queryUserInfo(),saveUserInfo(),editUserInfo(),deleteUserInfo()
- 数据库映射实体 后缀entity UserEntity
- controller 返回实体后缀Rsp UserRsp
- 参数校验实体 UserVo
- 部署需要写脚本,或者是利用框架,实现自动化
- 状态等类型必须使用枚举类型或者是单独一个类的实体的静态变量
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;//禁止
···
}
- if 嵌套不能超过三层,多使用if(){return;}
if(参数不正确){
return "返回参数不正确";
}
if(用户没有找到){
return "用户没有找到";
}
这个是自己最近总结的Java规范文档,在看别人代码并且对照自己编码习惯,总结以上几点。 以上有几点是关于web程序的建议。
代码一定要规范起来,这样自己再看自己的代码时,就可以形成一个固定的格式,很容易就能够理解,其他人在看自己的代码时,也能够清晰。写代码不仅仅让自己能够看得懂,而且还能够让其他人看的懂,需要有一个良好的编码习惯。
自己的Java规范文档的更多相关文章
- JVM 内部原理(五)— 基本概念之 Java 虚拟机官方规范文档,第 7 版
JVM 内部原理(五)- 基本概念之 Java 虚拟机官方规范文档,第 7 版 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - J ...
- 【转载】WEB前端开发规范文档
本文转载自谈笑涧<WEB前端开发规范文档> 为 新项目写的一份规范文档, 分享给大家. 我想前端开发过程中, 无论是团队开发, 还是单兵做站, 有一份开发文档做规范, 对开发工作都是很有益 ...
- 还在手工制作APP规范文档?这款设计神器你不容错过
之前写了一些关于APP原型文档的文章:一款APP的交互文档从撰写到交付 这次想写下关于APP设计规范文档的内容,规范文档这个东西,实际上大部分中小型公司没有这方面的需求,也没精力去制作这样一个系统性的 ...
- Java代码规范文档
NOTE:以下部分为一个简要的编码规范,更多规范请参考 ORACLE 官方文档. 地址:http://www.oracle.com/technetwork/java/codeconventions-1 ...
- 2.SDL规范文档
01.安全设计Checklist 输入验证 校验跨信任边界传递的不可信数据(策略检查数据合法性,含白名单机制等)格式化字符串时,依然要检验用户输入的合法性,避免可造成系统信息泄露或者拒绝服务 禁止向J ...
- Redis 基本安全规范文档
温馨提示:我在一家手游的公司工作,因为经常用到redis,特为此整理文档(借鉴过大神的文章): 一.什么是redis(出自百度百科)? redis是一个key-value存储系统.和Memcached ...
- Web前端开发规范文档
Web前端开发规范文档 规范目的: 使开发流程更加规范化. 通用规范: TAB键用两个空格代替(windos下tab键占四个空格,linux下TAB键占八个空格). CSS样式属性或者JAVASCRI ...
- 【转载】开发备必:WEB前端开发规范文档
规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必 须按本文档规范进行前台页面开发. 本文档如有不对或者 ...
- iOS代码规范文档
文件命名规范: 1. 项目统一使用类前缀ZY. 2. 分类命名+后面统一使用ZYExtension,例:NSDictionary+ZYExtension.h,常用分类定义在内部并写好文档注释.如果功能 ...
随机推荐
- requests接口测试——身份认证
当调用者访问接口时需要进行用户认证(用户名密码的登录),只有通过了认证才允许调用者访问接口. 1.基本身份认证 许多要求身份认证的web服务都接受HTTP Basic Auth.这是最简单的一种身份认 ...
- js字符转换为数字
转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类 ...
- 发布spring jar包, 报错
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Una ...
- VML元素的相关资料
虽然VML已经过气了,但有时我还不得不使用它,下面是我收集或研究得到的一些东西. 判定一个元素是否为VML元素 function isVML(el) { if (el && el.no ...
- kubelet disk 压力
systemctl stop docker mv /var/lib/docker /data/lib ln -s /data/lib/docker /var/lib/docker systemctl ...
- Redis 字典的实现
[Redis 字典的实现] 注意 dict 类型使用了两个指针,分别指向两个哈希表. 其中, 0 号哈希表(ht[0])是字典主要使用的哈希表, 而 1 号哈希表(ht[1])则只有在程序对 0 号哈 ...
- LevelDB 读取记录
[LevelDB 读取记录] LevelDb是针对大规模Key/Value数据的单机存储库,从应用的角度来看,LevelDb就是一个存储工具.而作为称职的存储工具,常见的调用接口无非是新增KV,删除K ...
- Graphics.Blit
[Graphics.Blit] 需求注意第4个参数,用4个参数pass用于指定使用哪一个pass.默认值为-1,即使用所有的pass. 参考:file:///C:/Program%20Files%20 ...
- Kafka命令行常用命令说明
基于0.8.0版本. ##查看topic分布情况kafka-list-topic.sh bin/kafka-list-topic.sh --zookeeper 192.168.197.170:2181 ...
- Cplus Overolad new and delete Operator
思考:在C++类中,通过设计类的构造和析构函数,就已经把复杂的内存管理起来了. 及时是简单的结构体,也是有构造和析构函数的,而下面这种情况,可以在非结构中使用. /** Operator Overlo ...