java代码结构优化 JAVA代码优化

Java都需要那些技术?

Java工程师需要学习的技术还是比较多的。

成都创新互联专注于青阳企业网站建设,响应式网站,商城网站开发。青阳网站建设公司,为青阳等地区提供建站服务。全流程按需搭建网站,专业设计,全程项目跟踪,成都创新互联专业和态度为您提供的服务

尤其是现在技术更新迭代比较快,需要不断学习掌握新的技术,给自身镀金才能在IT行业发展的较好。

下面列举出来一些需要掌握的技术:

1、理解Java面向对象思想

2、掌握开发中常用基础API

3、熟练使用集合框架、IO流、异常

4、能够基于JDK8开发

5、掌握流行关系型数据MySQL常见操作

6、熟练增删改查数据处理

7、掌握Java JDBC、连接池操作

8、掌握基本的JavaWeb基础知识JSP/Servlet/Vue等

9、具备基本的B/S结构软件开发能力

10、可以动手开发一个B/S架构的Web项目

11、掌握SSM框架技术

12、掌握使用Maven进行模块的开发

13、熟悉基本的Linux命令以及Linux服务器的使用

14、掌握高级缓存技术Redis的原理,并熟练使用

15、掌握Git、Nginx、Docker、Elasticsearch、SpringBoot、SpringCloud、RabbitMQ、分布式事务、JVM、JUC、Zookeeper、Dubbo、Nacos等技术

16、企业级开发项目

虽然需要学习掌握的技术比较多,但是坚信“只要功夫深铁杵磨成针”,加油!

解释JSP的作用,并列举JSP的特点

JSP是一种建立在Servlet规范功能之上的动态网页技术,是在通常的网页文件中嵌入脚本代码,用于产生动态内容,在JSP文件中嵌入的是java代码和JSP标记。

特点:

1、将内容的生成和显示进行分离使用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面。

2、强调可重用的组件绝大多数JSP页面依赖于可重用的,跨平台的组件来执行应用程序所要求的更为复杂的处理。

3、采用标识简化页面开发Web页面开发人员不会都是熟悉脚本语言的编程人员。

JSP的优缺点

一、缺点

1、JSP技术极大的增加了产品的复杂性。

2、java的高效率运行需要占用大量的内存和硬盘空间。一方面,java的高速运行是通过.class文件常驻内存来实现的,另一方面,还需要硬盘空间来存储一系列的.java文件和.class文件以及对应的版本文件。

3、JSP程序调试困难。

二、优点

1、JSP代码跨平台,即一次编写,处处运行。

2、JSP组件跨平台可重用,企业JavaBeans组件可以访问传统的数据库,并能以分布式系统模式工作于Solaris,Linux,UNIX和Windows平台。

3、支持多种网页格式。

4、JSP标签可扩充性。JSP技术允许开发者扩展JSP标签,定制JSP标签库,所以网页制作者充分利用与XML兼容的标签技术强大的功能,大大减少对脚本语言的依赖。

求java学习路线图?

/*回答内容很长,能看完的少走一个月弯路,绝不抖机灵*/

提前预警:本文适合Java新手阅读(老手可在评论区给下建议),希望大家看完能有所收获。

废话不多少了,先了解一下Java零基础入门学习路线:

第一阶段:JavaSE阶段

变量、数据类型、运算符

二进制和十进制的转化

注释、单行注释、多行注释、文本注释、注释内容和字节码的关系

标识符、关键字、驼峰原则

变量的本质、内存画图、变量声明和初始化

变量的分类和作用域(局部变量、成员变量、静态变量)

常量和Final

基本数据类型介绍

整型变量和整型常量

浮点类型、float、double

char字符型、转义字符

boolean布尔型、if语句使用要点、布尔类型占用空间问题

运算符介绍

算数运算符(二元、自增、自减)

赋值和赋值运算符

关系运算符详解

逻辑运算符、短路运算符详解

位运算符详解

字符串连接符

条件运算符(三元运算符)

运算符优先级问题

自动类型转换详解

强制类型装换详解

基本数据类型装换常见错误、溢出、L问题

使用Scanner获取键盘输入

控制语句

控制语句和实现逻辑对应

if单选结构

if_elseif_else多选结构

switch语句_IDEA更换主题

循环_while

循环_for循环_dowhile

嵌套循环

break和continue语句_标签_控制语句底层原理

写一个年薪计算机_百度查问题的秘诀(重要)

个人所得税计算器软件

方法核心详解_天才思维模型教你高手学习思维模式

方法的重载

递归结构讲解_递归头_递归体

面向对象编程-基础

面向过程和面向对象的区别

类和对象的概述

类的属性和方法

创建对象内存分析

构造方法(Construtor)及重载

对象类型的参数传递

this关键字

static关键字详解

局部代码块、构造代码块和静态代码块

package和import详解

JavaDoc生成API文档

面向对象编程-进阶

面向对象的三大特性

面向对象之【封装(Encapsulation)】

访问权限修饰符

面向对象之【继承(Inheritance)】

Object类

方法重写Override

super关键字详解

重写equals()和toString()

继承中对象创建的内存分析

面向对象之【多态(Polymorphism)】

向上转型

向下转型

instanceof运算符

编译时和运行时详解

final修饰符

抽象类和抽象方法(abstrct)

接口的定义和实现

JDK8的接口新特性

接口应用:内部类比较器Comparable

内部类详解

Java的内存管理与垃圾回收

异常机制

异常的概述

异常的执行过程与分析

try-catch-finally捕捉异常

throw抛出异常

throws声明异常

异常继承体系

运行时异常和编译异常

自定义异常

Java常用类

Wrapper包装类

自动装箱和自动拆箱

包装类的源码分析

String类的使用与内存原理

String类的源码分析

StringBuffer

StringBuilder

字符串处理类性能分析

Date类

System类

DateFormat类

Calendat类

Math类

BigInteger类和BigDecimal类

Random类

枚举类

File类

常见的面试题讲述与分析

数据结构算法

数据结构的概述

线性表

顺序表

链表

栈和队列

二叉树

二叉查找树

二叉平衡树

黑红树

冒泡排序

选择排序

递归

折半查找

集合(容器)

集合和数组的联系和区别

集合框架体系

ArrayList的使用和源码分析

集合中使用泛型

LinkedList的使用和源码分析

HashSet的使用和源码分析

哈希表及原理

TreeSet的使用和源码分析

比较器Comparable和Comparator

HashMap的使用和源码分析

TreeMap的使用和源码分析

Iterator于ListIterator

Collections工具类

旧集合类Vector、Hashtable

集合总结和选择依据

泛型接口

泛型类

泛型方法

IO流

IO流的概念

IO流的分类及其原理分析

文件流FlieInputStream、FileOutputStream

缓冲流BufferedInputStream、BufferedOutputStream

数据流ObjectInputStream、ObjectOutputStream

序列化和反序列化

转换流InputStreamReader、OutputStreamWriter

打印流PrintWrite和PrintStream

数组流ByteArrayOutputStream、ByteArrayInputStream

使用IO复制文件夹

多线程

进程和线程

线程的创建与启动

创建线程的三种方式对比

线程的生命周期

线程控制

多线程的安全问题与解决办法

线程的同步:同步代码块

线程的同步:同步方法

线程的同步:Lock锁

线程的死锁问题

线程通信

Condition

线程的完整生命周期

线程池ThreadPoolExecutor

ForkJoin框架

ThreadLocal类

网络编程

计算机网络基础知识

网络通信协议

OSI参考模型

TCP/IP参考模型

数据的封装与拆封原理解析

TCP协议

UDP协议

IP地址和端口号

URL和Socket

使用TCP编程实现登录功能

使用UDP编程实现客服系统

使用TCP编程实现文件上传

集合提升寻训练

手写ArrayList

手写单链表

手写Linkedlist

手写HashMap

手写HashSet

最新并发集合类

多线程提升训练

生产者消费者模式扩展

Lock锁和Condition

ReadWriteLock

BlockingQueue

volatile关键字

多线程题目练习

JDK新特征

面试题详解

设计模式

设计模式入门

面向对象设计七大原则

简单工厂模式

工厂方法模式

单例模式

原型模式

装饰模式

适配器模式

外观模式

第二阶段:数据库

MySQL基础

数据库基础知识

MySQL基础知识

MySQL8新特征

安装和卸载MySQL8

使用navicat访问数据库

SQL语言入门

创建数据库表

DML

修改删除数据库表

表的完整性约束

表的外键约束

DML扩展

MySQL 查询语句

基本select查询

where子句

函数

group by

having

SQL99-内连接查询

SQL99-外连接查询

SQL99-自连接查询

SQL92-连接查询

不相关子查询

相关子查询

分页查询

数据库对象

索引

事务及其特征

事务的并发问题

事务的隔离级别

存储过程

导入导出数据

JDBC

JDBC概述

使用JDBC完成添加/更新/删除操作

使用JDBC完成查询操作

JDBC常用接口

使用PreparedStatement

使用事务完成银行转账

提取DBUtil工具类

使用Properties读写属性文件

日志框架log4j

开发员工管理系统

第三阶段:JavaEE阶段

Servlet

web开发概述

B/S和C/S架构简介

HTTP协议

HTTP请求头和响应头

Tomcat安装使用

Tomcat目录结构

Servlet概述

Servlet快速入门

Servlet生命周期

读取配置文件信息

HttpServletRequest

HttpServletResponse

GET和POST区别

解决中文乱码

请求转发与重定向

绝对路径和相对路径

Cookie

Session

ServletContext

ServletConfig

JSP

JSP技术介绍

JSP的执行过程

scriptlet

表达式

声明

JSP指令元素

JSP动作元素

JSP隐式对象

JSP底层原理

九大内置对象

四个作用域

Servlet和JSP的关系和区别

MVC模式

合并Servlet

JavaScript

JavaScript概述与特点

JS基础语法

函数

数组

Math对象

String对象

Date对象

事件event

浏览器开发者工具

console

DOM和BOM

window

location

navigator

history

认识DOM

DOM获取元素

jQuery

jQuery简介及快速入门

jQuery入口函数

jQuery对象与DOM对象互相转换

基本选择器

属性选择器

位置选择器

表单选择器

内容选择器

jQuery事件

jQuery动画效果

DOM操作-操作文本

DOM操作-操作属性

DOM操作-操作元素

直接操作CSS样式

操作CSS类样式

购物车案例

表单验证

正则表达式

EL+JSTL+过滤器+监听器

EL介绍及使用

EL取值原理

EL隐含对象

EL逻辑运算

JSTL介绍-核心标签库

JSTL核心标签库

JSTL-格式标签库

Filter原理

Filter生命周期

Filter链

Filter登录验证

Filter权限控制

Listener概述及分类

Listener监听在线用户

Ajax和JSON

Ajax异步请求和局部刷新的原理

使用原生Ajax验证用户唯一性

jQuery Ajax

JSON的格式和使用

主要JSON解析器

Jackson的使用

Jackson的实现原理

使用jQuery Ajax实现三级联动

使用jQuery Ajax实现自动补全

分页和文件上传/下载

分页的意义

理解分页工具类

实现基本分页

实现带查询的分页

文件上传原理

文件上传API

实现文件上传

文件下载原理

文件下载响应头

实现文件下载

第四阶段:框架阶段

MyBatis

MyBatis概述

MyBatis入门配置

基本的CRUD操作

核心配置文件详解

Mapper.xml基础详解

模糊查询

分页的实现及插件PageHelper的使用

动态sql+sql片段的使用

一对多、多对一的关系处理

注解的使用

一级缓存和二级缓存说明及使用

generator逆向工程使用

Spring

Spring框架简介

Spring官方压缩包目录介绍

Spring环境搭建

IoC/DI容器详解

Spring创建Bean的三种方式

scope属性讲解

Spring中几种注入方式

静态代理设计模式

动态代理设计模式

AOP详解

AOP中几种通知类型

AOP两种实现方式

自动注入

声明式事务

事务传播行为

事务隔离级别

只读事务

事务回滚

基于注解式配置

常用注解

Spring 整合MyBatis

i18n

Spring整合Junit

SpringMVC

MVC架构模式

手写MVC框架

SpringMVC简介

SpringMVC运行原理

基于配置文件方式搭建环境

基于注解方式搭建环境

SpringMVC的跳转及视图解析器的配置

SpringMVC和Ajax的交互

Spring 参数注入

SpringMVC作用域传值

视图解析器

文件下载

文件上传

Spring拦截器/拦截器栈

登录状态验证

SpringMVC容器和Spring容器介绍

异常处理4种方式

SpringMVC5其他常用注解

Maven

Maven简介

Maven原理

Linux安装及注意事项

Maven项目结构

POM模型

Maven 中项目类型

创建WAR类型的Maven项目

scope属性可取值

SSM项目拆分演示

Maven的常见插件讲解

热部署

BootStrap

BootStrap概述

BootStrap栅格系统

BootStrap常用全局CSS样式

常用组件

常用JavaScript插件

RBAC

RBAC概述

RBAC发展历史

基于RBAC的数据库表设计

URL拦截实现

动态菜单实现

密码学

第五阶段:前后端分离阶段

Spring Boot

Spring Boot简介

Spring Boot实现Spring MVC

配置文件顺序及类型讲解

Spring Boot项目结构

Spring Boot 整合MyBatis

Spring Boot 整合Druid

Spring Boot 整合PageHelper

Spring Boot 整合logback

Spring Boot 整合JSP

Spring Boot 整合Thymeleaf

Spring Boot 开发者工具

Spring Boot 异常显示页面

Spring Boot 整合Junit4

Spring Boot 项目打包部署

Spring Boot 整合Quartz

Spring Boot 中Interceptor使用

Spring Boot Actuator

HikariCP

Logback

Logback简介

Logback依赖说明

Logback 配置文件讲解

Logback 控制台输出

Logback 文件输出

Logback 数据库输出

Spring Security

Spring Security简介

Spring Security架构原理

什么是认证和授权

基础环境搭建

自定义认证流程

UserDetailsService和UserDetails

PasswordEncoder

自定义认证结果

授权-访问路径匹配方式

授权-权限管理

基于注解实现权限管理

Thymeleaf整合Security权限管理

Rememberme 实现

退出实现

CSRF

Linux - CentOS 8

Linux简介

VMWare安装及使用

Linux安装及注意事项

Linux目录结构及路径

Linux常用命令

VMWare常用配置

XShell安装及使用

Xftp安装及使用

JDK解压版配置步骤

Tomcat配置步骤

安装MySQL

WAR包部署

Docker

Docker简介

Docker与VM对比

Docker特点

Docker架构

Docker安装与启动

镜像加速器配置

Docker镜像操作常用命令

Docker容器操作常用命令

DockerFile

搭建本地镜像仓库

推送镜像到阿里云及本地仓库

Docker容器生命周期

Docker数据管理

Redis

Redis简介

Redis 单机版安装

Redis 数据类型介绍

Redis 常用命令

Redis 持久化方案

Redis 的主从搭建

Redis的哨兵搭建

Redis 的集群搭建

Spring Boot整合Spring Data Redis

Redis的缓存穿透

Redis的缓存雪崩

Redis的缓存击穿

Vue

vsCode和插件安装

webpack介绍

Vue项目创建

Vue模板语法

Vue条件渲染

Vue列表渲染

Vue事件处理

Vue计算属性

Vue Class与Style

Vue表单处理

Vue组件

Vue组件生命周期

Vue 路由配置

Vue Axios网络请求

Vue跨域处理

Vue Element

Mock.js

Swagger

Swagger2简介

Springfox

Swagger2基本用法

Swagger-UI用法

Swagger2配置

Swagger2常用配置

Git/GitEE

Git的下载和安装

Git和SVN对比

Git创建版本库

Git版本控制

Git远程仓库

Git分支管理

Git标签管理

GitEE建库

GitEE 连接及使用

GitEE 组员及管理员配置

第六阶段:微服务架构

FastDFS

分布式文件系统概述

FastDFS简介

FastDFS架构

Tracker Server

Storage Server

FastDFS安装

安装带有FastDFS模块的Nginx

Fastdfs-java-client的使用

创建Fastdfs-java-client工具类

实现文件上传与下载

KindEditor介绍

通过KindEditor实现文件上传并回显

RabbitMQ

AMQP简介

RabbitMQ简介

安装Erlang

安装RabbitMQ

RabbitMQ原理

Spring Boot 集成RabbitMQ

RabbitMQ的交换器

Spring AMQP的使用

Spring Cloud Netflix Eureka

Eureka简介

Eureka和Zookeeper 对比

搭建Eureka注册中心

Eureka 服务管理平台介绍

搭建高可用集群

集群原理

Eureka优雅停服

Spring Cloud Netflix Ribbon

Ribbon简介

集中式与进程内负载均衡区别

Ribbon常见的负载均衡策略

Ribbon的点对点直连

Spring Cloud OpenFeign

Feign简介

Feign的请求参数处理

Feign的性能优化

配置Feign负载均衡请求超时时间

Spring Cloud Netflix Hystrix

Hystrix简介

服务降级

服务熔断

请求缓存

Feign的雪崩处理

可视化的数据监控Hystrix-dashboard

Spring Cloud Gateway

Spring Cloud Gateway简介

Gateway基于配置文件实现路由功能

Gateway基于配置类实现路由功能

Gateway中内置过滤器的使用

Gateway中自定义GatewayFilter过滤器的使用

Gateway中自定义GlobalFilter过滤器的使用

Gateway中使用过滤器实现鉴权

Gateway结合Hystrix实现熔断功能

Spring Cloud Config

什么是分布式配置中心

创建配置中心服务端

创建配置中心客户端

基于Gitee存储配置文件

基于分布式配置中心实现热刷新

Spring Cloud Bus

什么是消息总线

基于消息总线实现全局热刷新

ELK

ElasticSearch介绍

ElasticSearch单机版安装

ElasticSearch集群版安装

ElasticSearch索引管理

ElasticSearch文档管理

ElasticSearch文档搜索

SpringDataElasticSearch访问ElasticSearch

LogStash介绍

基于LogStash收集系统日志

TX-LCN

分布式事务简介

分布式事务两大理论依据

分布式事务常见解决方案

LCN简介

TX-LCN的3种模式

LCN原理

LCN环境搭建及Demo演示

Nginx

Nginx的简介

什么是正向代理、反向代理

Nginx的安装

Nginx配置虚拟主机

Nginx配置服务的反向代理

Nginx的负载均衡配置

Spring Session

Spring Session介绍

通过Spring Session共享session中的数据

通过Spring Session同步自定义对象

Spring Session的Redis存储结构

设置Session失效时间

Spring Session序列化器

MyBatis Plus

MyBatis Plus简介

Spring整合MyBatis Plus

MyBatis Plus的全局策略配置

MyBatis 的主键生成策略

MyBatis Plus的CRUD操作

条件构造器EntityWrapper讲解

MyBatis Plus的分页插件配置

MyBatis Plus的分页查询

MyBatis Plus的其他插件讲解

MyBatis Plus的代码生成器讲解

MyBatis Plus的公共字段自动填充

ShardingSphere

简介

数据库切分方式

基本概念

MySQL主从配置

切片规则

读写分离

实现分库分表

第七阶段:云服务阶段

Kafka

Kafka简介

Kafka架构

分区和日志

Kafka单机安装

Kafka集群配置

自定义分区

自动控制

Spring for Apache Kafka

Zookeeper

Zookeeper简介和安装

Zookeeper 数据模型

Zookeeper 单机版安装

Zookeeper常见命令

ZClient操作Zookeeper

Zookeeper 集群版安装

Zookeeper 客户端常用命令

Zookeeper分布式锁

RPC

什么是分布式架构

什么是RFC、RPC

HttpClient实现RPC

RestTemplate

RMI实现RPC

基于Zookeeper实现RPC 远程过程调用

Dubbo

SOA架构介绍

Dubbo简介

Dubbo结构图

Dubbo注册中心

Dubbo 支持的协议

Dubbo 注册中心搭建

Spring Boot 整合 Dubbo

Admin管理界面

Dubbo 搭建高可用集群

Dubbo 负载均衡

Spring Cloud Alibaba Dubbo

Spring Cloud Alibaba Dubbo简介

基于Zookeeper发布服务

基于Zookeeper订阅服务

实现远程服务调用处理

Spring Cloud Alibaba Nacos

Spring Cloud Alibaba Nacos简介

搭建Nacos服务器

基于Nacos发布|订阅服务

实现远程服务调用处理

Nacos Config配置中心

Spring Cloud Alibaba Sentinel

Spring Cloud Alibaba Sentinel简介

搭建Sentinel服务器

Sentinel-实时监控

Sentinel-簇点链路

Sentinel-授权规则

Sentinel-系统规则

@SentinelResource注解

持久化规则

Spring Cloud Alibaba Seata

Spring Cloud Alibaba Seata简介

搭建Seata服务器

Seata支持的事务模式-AT模式

Seata支持的事务模式-TCC模式

Seata支持的事务模式-Saga模式

Seata支持的事务模式-XA模式

SeataAT事务模式应用方式

SeataTCC事务模式应用方式

北大青鸟java培训:提高用户体验度的方法有哪些?

对于大多数运营和设计师来说,如何提高用户体验都是经常研究的话题,那么有哪些方法能够提高用户的体验呢?下面我们就山东电脑培训给大家简单介绍一下,我们如何优化网页设计页面的导航条来优化和提高用户客户体验吧。

信息架构符合用户的心理模型以及它们期望在网站或应用程序特性和内容如何被构建的。

定义结构在设计导航之前定义IA是很重要的。

可以做一种卡用来组织不同的页面转化为不同的类别。

你可以与用户组即你征求一些目标用户一起做这些,让他们安排不同的标签组或使用专家设计,有许多工具可以用来定义你的网站或软件的结构。

CTA引导用户期望吗?网站的信任和可信度取决于一些小细节,比如拼写错误之类的东西,但也取决于按钮或链接的对齐以及他们的引导。

在整个网站或应用程序中,导航结构的方法易于识别和可持续性使用。

你期望的东西在哪里?是结构明确和一致吗?完整的用户体验是建立在用户经受的一切之上。

建立在我们所知道的导航和所有不同组件之上。

选项的数量是合理的(即任何一次都不超过5_7项)在任何界面产品中,无论是一个iOS应用程序或网站,你应该让选项尽量少。

你不希望用户丢失,或者被你的网站的结构搞晕。

提供选项的数量应该是合理的。

在我的经验中,有太多的选择可以超载用户会适得其反,你想实现什么业务。

你应该有一个小而且有针对性的常用选项。

我经常会问产品所有者或者有对这块熟悉的人,用户使用最多或者优先考虑的选项是什么。

对于一个典型的网站,应该是在每个页面,非常简单的以一致的方式列出七个左右的链接。

如果你工作在一个大规模的有重要的信息架构网站,你将需要仔细考虑如何构建你的链接。

C++和JAVA的区别是什么?

C语言是经典的面向过程的编程语言,编程入门一般都学C语言以了解编程以及锻炼逻辑思维能力,在一些跟硬件比较紧密的编程中也经常用到。\x0d\x0a\x0d\x0aC++是在C语言的基础上加入了面向对象的概念,成为混合型面向对象语言,功能强大,但难度也大。\x0d\x0a\x0d\x0aJava是在C++的基础上进行改进的,摒弃了一些C++的不足之处,语法跟C++很像,它是运行在Java虚拟机上,所以可以跨平台,一处编译,到处执行。\x0d\x0a\x0d\x0a编程都是易学难精,哪个都好学,哪个又都不好学。都有很好的发展前景,就看是什么方向了。底层的C、桌面应用程序、游戏等等C++、嵌入式,网页,Java。

Java企业软件开发设计说明书如何做

1、组织与风格(1).关键词和操作符之间加适当的空格。(2).相对独立的程序块与块之间加空行(3).较长的语句、表达式等要分成多行书写。(4).划分出的新行要进行适应的缩进,使排版整齐,语句可读。(5).长表达式要在低优先级操作符处划分新行,操作符放在新行之首。(6).循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分。(7).若函数或过程中的参数较长,则要进行适当的划分。(8).不允许把多个短语句写在一行中,即一行只写一条语句。(9).函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格。注:如果大家有兴趣可以到安安DIY创作室博客,有相关说明性的文章和解释。2、注解Java 的语法与 C++ 及为相似,那么,你知道 Java 的注释有几种吗?是两种?// 注释一行/* ...... */ 注释若干行不完全对,除了以上两种之外,还有第三种,文档注释:/** ...... */ 注释若干行,并写入 javadoc 文档注释要简单明了。String userName = null; //用户名边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。在必要的地方注释,注释量要适中。注释的内容要清楚、明了,含义准确,防止注释二义性。保持注释与其描述的代码相邻,即注释的就近原则。对代码的注释应放在其上方相邻位置,不可放在下面。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释应放在此域的右方;同一结构中不同域的注释要对齐。变量、常量的注释应放在其上方相邻位置或右方。全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。在每个源文件的头部要有必要的注释信息,包括:文件名;版本号;作者;生成日期;模块功能描述(如功能、主要算法、内部各部分之间的关系、该文件与其它文件关系等);主要函数或过程清单及本文件历史修改记录等。/*** Copy Right Information : Neusoft IIT* Project : eTrain* JDK version used : jdk1.3.1* Comments : config path* Version : 1.01* Modification history :2003.5.1* Sr Date Modified By Why What is modified* 1. 2003.5.2 Kevin Gao new**/在每个函数或过程的前面要有必要的注释信息,包括:函数或过程名称;功能描述;输入、输出及返回值说明;调用关系及被调用关系说明等/*** Description :checkout 提款* @param Hashtable cart info* @param OrderBean order info* @return String*/public String checkout(Hashtable htCart,OrderBean orderBean)throws Exception{}javadoc注释标签语法@author 对类的说明 标明开发该类模块的作者@version 对类的说明 标明该类模块的版本@see 对类、属性、方法的说明 参考转向,也就是相关主题@param 对方法的说明 对方法中某参数的说明@return 对方法的说明 对方法返回值的说明@exception 对方法的说明 对方法可能抛出的异常进行说明3、命名规范定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)较短的单词可通过去掉元音形成缩写;要不然最后自己写的代码自己都看不懂了,那可不行。较长的单词可取单词的头几发符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。使用匈牙利表示法Package 的命名Package 的名字应该都是由一个小写单词组成。package com.neu.utilClass 的命名Class 的名字必须由大写字母开头而其他字母都小写的单词组成,对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。public class ThisAClassName{}Class 变量的命名变量的名字必须用一个小写字母开头。后面的单词用大写字母开头userName , thisAClassMethodStatic Final 变量的命名static Final 变量的名字应该都大写,并且指出完整含义。/***DBConfig PATH**/public static final StringDB_CONFIG_FILE_PATH =com.neu.etrain.dbconfig;参数的命名参数的名字必须和变量的命名规范一致。数组的命名数组应该总是用下面的方式来命名:byte[] buffer;而不是:byte buffer[];方法的参数使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:SetCounter(int size){this.size = size;}4、文件样式所有的 Java(*.java) 文件都必须遵守如下的样式规则:版权信息版权信息必须在 java 文件的开头,比如:/** Copyright ? 2000 Shanghai XXX Co. Ltd.* All right reserved.*/其他不需要出现在 javadoc 的信息也可以包含在这里。Package/Importspackage 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。如果 import 行中包含了同一个包中的不同子目录,则应该用 * 来处理。package hotlava.net.stats;import java io.*;import java.util.Observable;import hotlava.util.Application;这里 java。io.* 使用来代替InputStream and OutputStream 的。Class接下来的是类的注释,一般是用来解释类的。/*** A class representing a set of packet and byte counters* It is observable to allow it to be watched, but only* reports changes when the current set is complete*/接下来是类定义,包含了在不同的行的 extends 和 implementspublic class CounterSetextends Observableimplements CloneableClass Fields接下来是类的成员变量:/*** Packet counters*/protected int[] packets;public 的成员变量必须生成文档(JavaDoc)。proceted、private和 package 定义的成员变量如果名字含义明确的话,可以没有注释。存取方法接下来是类变量的存取的方法。它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。/*** Get the counters* @return an array containing the statistical data. This array has been* freshly allocated and can be modified by the caller.*/public int[] getPackets() { return copyArray(packets, offset); }public int[] getBytes() { return copyArray(bytes, offset); }public int[] getPackets() { return packets; }public void setPackets(int[] packets) { this.packets = packets; }其它的方法不要写在一行上构造函数接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面)。访问类型 (public, private 等.) 和 任何 static, final 或 synchronized 应该在一行中,并且方法和参数另写一行,这样可以使方法和参数更易读。publicCounterSet(int size){this.size = size;}克隆方法如果这个类是可以被克隆的,那么下一步就是 clone 方法:publicObject clone() {try {CounterSet obj = (CounterSet)super.clone();obj.packets = (int[])packets.clone();obj.size = size;return obj;}catch(CloneNotSupportedException e) {throw new InternalError(Unexpected CloneNotSUpportedException: +e.getMessage());}}类方法下面开始写类的方法:/*** Set the packet counters* (such as when restoring from a database)*/protected finalvoid setArray(int[] r1, int[] r2, int[] r3, int[] r4)throws IllegalArgumentException{//// Ensure the arrays are of equal size//if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)throw new IllegalArgumentException(Arrays must be of the same size);System.arraycopy(r1, 0, r3, 0, r1.length);System.arraycopy(r2, 0, r4, 0, r1.length);}toString 方法无论如何,每一个类都应该定义 toString 方法:publicString toString() {String retval = CounterSet: ;for (int i = 0; i data.length(); i++) {retval += data.bytes.toString();retval += data.packets.toString();}return retval;}}main 方法如果main(String[]) 方法已经定义了, 那么它应该写在类的底部.5、代码可读性避免使用不易理解的数字,用有意义的标识来替代。不要使用难懂的技巧性很高的语句。源程序中关系较为紧密的代码应尽可能相邻。6、代码性能在写代码的时候,从头至尾都应该考虑性能问题。这不是说时间都应该浪费在优化代码上,而是我们时刻应该提醒自己要注意代码的效率。比如:如果没有时间来实现一个高效的算法,那么我们应该在文档中记录下来,以便在以后有空的时候再来实现她。不是所有的人都同意在写代码的时候应该优化性能这个观点的,他们认为性能优化的问题应该在项目的后期再去考虑,也就是在程序的轮廓已经实现了以后。不必要的对象构造不要在循环中构造和释放对象使用 StringBuffer 对象在处理 String 的时候要尽量使用 StringBuffer 类,StringBuffer 类是构成 String 类的基础。String 类将 StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大部分的工作,当工作完成后将 StringBuffer 对象再转换为需要的 String 对象。比如:如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用StringBuffer 对象和她的 append() 方法。如果我们用 String 对象代替StringBuffer 对象的话,会花费许多不必要的创建和释放对象的 CPU 时间。大家可以来安安DIY创作室一起讨论。避免太多的使用 synchronized 关键字避免不必要的使用关键字 synchronized,应该在必要的时候再使用她,这是一个避免死锁的好方法。7、编程技巧byte 数组转换到 characters为了将 byte 数组转换到 characters,你可以这么做:Hello world!.getBytes();Utility 类Utility 类(仅仅提供方法的类)应该被申明为抽象的来防止被继承或被初始化。初始化下面的代码是一种很好的初始化数组的方法:objectArguments = new Object[] { arguments };枚举类型JAVA 对枚举的支持不好,但是下面的代码是一种很有用的模板:class Colour {public static final Colour BLACK = new Colour(0, 0, 0);public static final Colour RED = new Colour(0xFF, 0, 0);public static final Colour GREEN = new Colour(0, 0xFF, 0);public static final Colour BLUE = new Colour(0, 0, 0xFF);public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF);}这种技术实现了RED, GREEN, BLUE 等可以象其他语言的枚举类型一样使用的常量。他们可以用 '==' 操作符来比较。但是这样使用有一个缺陷:如果一个用户用这样的方法来创建颜色 BLACK new Colour(0,0,0)那么这就是另外一个对象,'=='操作符就会产生错误。她的 equal() 方法仍然有效。由于这个原因,这个技术的缺陷最好注明在文档中,或者只在自己的包中使用。8、编写格式代码样式代码应该用 unix 的格式,而不是 windows 的(比如:回车变成回车+换行)文档化必须用 javadoc 来为类生成文档。不仅因为它是标准,这也是被各种 java 编译器都认可的方法。使用 @author 标记是不被推荐的,因为代码不应该是被个人拥有的。缩进缩进应该是每行2个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度.如果你使用 UltrEdit 作为你的 Java 源代码编辑器的话,你可以通过如下操作来禁止保存Tab字符, 方法是通过 UltrEdit中先设定 Tab 使用的长度室2个空格,然后用 Format|Tabs to Spaces 菜单将 Tab 转换为空格。页宽页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进2个字符.{} 对{} 中的语句应该单独作为一行. 例如, 下面的第1行是错误的, 第2行是正确的:if (i0) { i ++ }; // 错误, { 和 } 在同一行if (i0) {i ++}; // 正确, { 单独作为一行} 语句永远单独作为一行.如果 } 语句应该缩进到与其相对应的 { 那一行相对齐的位置。括号左括号和后一个字符之间不应该出现空格, 同样, 右括号和前一个字符之间也不应该出现空格. 下面的例子说明括号和空格的错误及正确使用:CallProc( AParameter ); // 错误CallProc(AParameter); // 正确不要在语句中使用无意义的括号. 括号只应该为达到某种目的而出现在源代码中。下面的例子说明错误和正确的用法:if ((I) = 42) { // 错误 - 括号毫无意义if (I == 42) or (J == 42) then // 正确 - 的确需要括号9、代码编译1.编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成代码丢失。2.同一项目组内,最好使用相同的编辑器,并使用相同的设置选项。3.合理地设计软件系统目录,方便开发人员使用。4.打开编译器的所有告警开关对程序进行编译。5.在同一项目组或产品组中,要统一编译开关选项。6.使用工具软件(如Visual SourceSafe)对代码版本进行维护。如果大家有不明白的可以到安安DIY创作室留言。10、可移植性Borland Jbulider 不喜欢 synchronized 这个关键字,如果你的断点设在这些关键字的作用域内的话,调试的时候你会发现的断点会到处乱跳,让你不知所措。除非必须,尽量不要使用。换行如果需要换行的话,尽量用 println 来代替在字符串中使用\n。你不要这样:System.out.print(Hello,world!\n);要这样:System.out.println(Hello,world!);或者你构造一个带换行符的字符串,至少要象这样:String newline = System.getProperty(line.separator);System.out.println(Hello world + newline);PrintStreamPrintStream 已经被不赞成(deprecated)使用,用 PrintWrite 来代替它。


当前标题:java代码结构优化 JAVA代码优化
文章链接:http://hbruida.cn/article/dosodso.html