ataopro-alibaba-java-coding-guidelines
2
总安装量
2
周安装量
#69285
全站排名
安装命令
npx skills add https://github.com/ataopro/ataopro-alibaba-java-coding-guidelines --skill ataopro-alibaba-java-coding-guidelines
Agent 安装分布
openclaw
2
claude-code
2
opencode
2
mcpjam
1
openhands
1
zencoder
1
Skill 文档
é¿éå·´å·´Javaå¼åæå
æ¬æè½åºäºé¿éå·´å·´Javaå¼åæåï¼ç®ç§°ï¼é¿éå¼åè§èï¼ï¼ç¨äºJava代ç è§èæ£æ¥ãæå¯¼å¼åå代ç 审æ¥ã
触ååºæ¯
å½ç¨æ·è¡¨è¾¾ä»¥ä¸æå¾æ¶ï¼æ¤æè½å°è¢«èªå¨æ¿æ´»ï¼
1. 代ç è§èæ£æ¥
- “æ£æ¥ä»£ç è§è”
- “å¸®ææ£æ¥Javaä»£ç ”
- “代ç 审楔
- “æ¥çä»£ç æ¯å¦ç¬¦åé¿éè§è”
- “æ£æ¥ä»£ç æ¯å¦æé®é¢”
- “帮æreviewä¸ä¸è¿æ®µä»£ç ”
2. æå®å¼åè§è
- “使ç¨é¿éå¼åè§è”
- “ç¨é¿éå·´å·´è§èå¼å”
- “æé¿éå¼åæå楔
- “éµå¾ªé¿éå¼åè§è”
- “é¿éå¼åè§è”
- “æç §è§èæ¥å”
3. ä¼å建议
- “ä¼åJavaä»£ç ”
- “ä»£ç æ¹è¿å»ºè®®”
- “å¦ä½ååºè§èçJavaä»£ç ”
- “è¿æ®µä»£ç æä¹æ¹æ´å¥½”
æ ¸å¿è§å鿥
1. å½å飿 ¼ ã强å¶ã
| è§å | æ£ä¾ | åä¾ |
|---|---|---|
| ç±»å | UserDO, CacheServiceImpl, OrderDTO |
userDo, User_Do |
| æ¹æ³å/åé | getUserById, localValue, inputUserId |
get_user_by_id |
| 常é | MAX_STOCK_COUNT, DEFAULT_TIMEOUT |
MAX_COUNT, maxStockCount |
| å¸å°åé | deleted, active, isValid(ä»
boolean) |
isDeleted(POJOä¸) |
| å å | com.alibaba.open.util |
com.Alibaba.Open.util |
å ³é®è§åï¼
- ç¦æ¢ä¸å线æç¾å 符å·å¼å¤´/ç»å°¾
- ç¦æ¢æ¼é³è±ææ··å
- æ½è±¡ç±»ä»¥
AbstractæBaseå¼å¤´ - å¼å¸¸ç±»ä»¥
Exceptionç»å°¾ - æµè¯ç±»ä»¥
Testç»å°¾
2. 常éå®ä¹ ã强å¶ã
// â åä¾ - éæ³å¼
String key = "Id#taobao_" + tradeId;
cache.put(key, value);
// â
æ£ä¾
private static final String KEY_PREFIX = "Id#taobao_";
String key = KEY_PREFIX + tradeId;
// â åä¾ - å°ålææ··æ·
Long a = 2l;
// â
æ£ä¾
Long a = 2L;
3. OOPè§çº¦ ã强å¶ã
equalsè°ç¨é¡ºåº
// â åä¾ - å¯è½æNPE
object.equals("test");
// â
æ£ä¾ - æ¨è
"test".equals(object);
Objects.equals(object, "test");
å è£ ç±»æ¯è¾
// â
æ£ä¾ - 使ç¨equals
Integer a = 128;
Integer b = 128;
a.equals(b); // true
// â åä¾ - == æ¯è¾
a == b; // false (è¶
åº-128~127èå´)
POJOç±»è§è
// â åä¾ - 使ç¨åºæ¬ç±»å
public class User {
private int id; // åºæ¬ç±»å
private boolean isActive; // isåç¼
private Date gmtCreate = new Date(); // é»è®¤å¼
}
// â
æ£ä¾
public class User {
private Long id; // å
è£
ç±»å
private Boolean active; // æ isåç¼
private Date gmtCreate; // æ é»è®¤å¼
}
è®¿é®æ§å¶ä»ä¸¥
// å·¥å
·ç±»
public final class StringUtils {
private StringUtils() {} // ç§ææé
}
// æ¹æ³å¯è§æ§
private void internalMethod() {} // ä»
å
é¨ä½¿ç¨
protected void hookMethod() {} // ä¾åç±»è°ç¨
public void publicApi() {} // 坹夿´é²
4. éåå¤ç ã强å¶ã
hashCodeä¸equals
// â åä¾ - åªéåequals
@Override
public boolean equals(Object o) { ... }
// â
æ£ä¾ - é
对éå
@Override
public boolean equals(Object o) { ... }
@Override
public int hashCode() { ... }
subListä¸å¯å¼ºè½¬
// â åä¾
ArrayList list = subList; // ClassCastException
// â
æ£ä¾
List list = subList;
Arrays.asList()ä¸å¯ä¿®æ¹
// â åä¾
String[] str = {"a", "b"};
List list = Arrays.asList(str);
list.add("c"); // UnsupportedOperationException
// â
æ£ä¾ - éè¦å¯ä¿®æ¹å表
List<String> list = new ArrayList<>(Arrays.asList(str));
foreachä¸ç¦æ¢remove
// â åä¾ - ConcurrentModificationException
for (String item : list) {
list.remove(item);
}
// â
æ£ä¾
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if (condition) {
it.remove();
}
}
// â
JDK8+ æ¨è
list.removeIf(item -> condition);
Mapéå
// â åä¾ - keySetéå两次
for (String key : map.keySet()) {
Object value = map.get(key);
}
// â
æ£ä¾ - entrySet䏿¬¡éå
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
}
// â
JDK8+ æ¨è
map.forEach((k, v) -> { ... });
5. å¹¶åå¤ç ã强å¶ã
çº¿ç¨æ± å建
// â åä¾ - å¯è½å¯¼è´OOM
ExecutorService executor = Executors.newFixedThreadPool(10);
ExecutorService executor = Executors.newCachedThreadPool();
// â
æ£ä¾
ExecutorService executor = new ThreadPoolExecutor(
10, // corePoolSize
50, // maximumPoolSize
60L, TimeUnit.SECONDS, // keepAliveTime
new LinkedBlockingQueue<>(100), // workQueue
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("custom-pool-" + t.getId());
return t;
}
},
new ThreadPoolExecutor.AbortPolicy()
);
SimpleDateFormat线ç¨ä¸å®å ¨
// â åä¾ - 线ç¨ä¸å®å
¨
private static final DateFormat DF = new SimpleDateFormat("yyyy-MM-dd");
// â
æ¹æ¡1: ThreadLocal
private static final ThreadLocal<DateFormat> DF =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
// â
æ¹æ¡2: JDK8+ æ¨è
private static final DateTimeFormatter DTF =
DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse("2024-01-01", DTF);
Randomå¤çº¿ç¨
// â åä¾ - 线ç¨ç«äº
Random random = new Random();
int randomValue = random.nextInt(100);
// â
æ£ä¾
int randomValue = ThreadLocalRandom.current().nextInt(100);
6. æ§å¶è¯å¥ ã强å¶ã
// â åä¾ - æ 大æ¬å·
if (condition)
doSomething();
// â
æ£ä¾
if (condition) {
doSomething();
}
// â åä¾ - switchæ default
switch (status) {
case 1: doThing(); break;
case 2: doOther(); break;
}
// â
æ£ä¾ - å¿
é¡»ædefault
switch (status) {
case 1: doThing(); break;
case 2: doOther(); break;
default: logger.warn("Unknown status: {}", status);
}
7. 注éè§è ã强å¶ã
/**
* æ ¹æ®ç¨æ·IDè·åç¨æ·ä¿¡æ¯
*
* @param userId ç¨æ·IDï¼ä¸è½ä¸ºç©º
* @return ç¨æ·ä¿¡æ¯ï¼å¦æä¸åå¨è¿ånull
* @throws IllegalArgumentException if userId is null
*/
public UserDO getUserById(Long userId) {
// åè¡æ³¨é
if (userId == null) {
throw new IllegalArgumentException("userIdä¸è½ä¸ºç©º");
}
// TODO(zhangsan: 2024-01-01) çéæ±ç¡®è®¤åå®ç°ç¼å
// FIXME(å¼ ä¸: 2024-01-15) é«å¹¶å䏿æ§è½é®é¢ï¼éè¦ä¼å
return userDAO.selectById(userId);
}
8. MySQLè§çº¦ ã强å¶ã
| è§å | 说æ |
|---|---|
| 主é®å½å | id æ {表å}_id |
| ç´¢å¼å½å | idx_åæ®µå, uniq_åæ®µå |
| å¸å°å段 | is_xxx / xxx_status |
| æ¶é´å段 | gmt_create, gmt_modified |
| å 餿 è®° | is_deleted (0/1) |
-- â
æ£ä¾
CREATE TABLE user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
status TINYINT DEFAULT 0 COMMENT '0-æ£å¸¸ 1-ç¦ç¨',
gmt_create DATETIME DEFAULT CURRENT_TIMESTAMP,
gmt_modified DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
is_deleted TINYINT DEFAULT 0
);
CREATE INDEX idx_username ON user(username);
CREATE UNIQ INDEX uniq_phone ON user(phone);
9. å¼å¸¸å¤ç ã强å¶ã
// â åä¾
try {
doSomething();
} catch (Exception e) {
// æè·ææå¼å¸¸
}
// â åä¾ - åæå¼å¸¸
try {
doSomething();
} catch (Exception e) {
// ä»ä¹é½ä¸å
}
// â
æ£ä¾
try {
doSomething();
} catch (SpecificException e) {
logger.error("ä¸å¡é误æè¿°", e);
throw new BusinessException("ç¨æ·å好çé误信æ¯");
}
// â
æ£ä¾ - try-with-resources
try (Connection conn = dataSource.getConnection()) {
// èªå¨å
³é
}
10. æ¥å¿è§çº¦ ã强å¶ã
// â åä¾
logger.info("ç¨æ·ç»å½: " + userId);
logger.debug("debug info");
logger.error(e.getMessage()); // ä¸¢å¤±å æ
// â
æ£ä¾ - å
å«ä¸ä¸æ
logger.info("ç¨æ·ç»å½æå, userId={}, ip={}", userId, ip);
logger.warn("åºåä¸è¶³, skuId={}, available={}", skuId, available);
logger.error("è°ç¨ä¸æ¸¸æå¡å¤±è´¥, service=order, error={}", e.getMessage(), e);
// æ£ç¡®çæ¥å¿çº§å«
logger.error("ç³»ç»å¼å¸¸", e); // ERROR: å½±ååè½
logger.warn("ä¸å¡æ ¡éªå¤±è´¥", e); // WARN: éå
³æ³¨ä½ä¸å½±å
logger.info("订åå建æå, orderId={}", orderId); // INFO: å
³é®èç¹
logger.debug("请æ±åæ°: {}", params); // DEBUG: è°è¯ä¿¡æ¯
ä»£ç æ ¼å¼è§è
缩è¿ä¸ç©ºæ ¼
// â
缩è¿4ä¸ªç©ºæ ¼ï¼è¿ç®ç¬¦å·¦å³åä¸ç©ºæ ¼ï¼å
³é®è¯ä¸æ¬å·é´æç©ºæ ¼
public static void main(String[] args) {
String say = "hello";
int flag = 0;
if (flag == 0) {
System.out.println(say);
} else if (flag == 1) {
System.out.println("world");
} else {
System.out.println("ok");
}
}
// â
æ¹æ³åæ°éå·åæç©ºæ ¼
method("a", "b", "c");
æ¢è¡è§å
// â
è¶
120å符æ¢è¡ï¼ç¼©è¿4ç©ºæ ¼
StringBuffer sb = new StringBuffer();
sb.append("zi").append("xin")...
.append("huang")...
.append("huang")...
.append("huang");
// â
å¤åæ°æ¢è¡
method(args1, args2, args3,
args4, args5);
å¿«éæ£æ¥æ¸ å
ä»£ç æäº¤åéé¡¹æ£æ¥ï¼
åºç¡è§è
- å½å符åè§èï¼ç±»åãæ¹æ³åã常éçï¼
- å åå ¨å°åï¼æ 夿°å½¢å¼
- æ ä¸å线/ç¾å 符å·å¼å¤´ç»å°¾
代ç è´¨é
- æ éæ³å¼ï¼ä½¿ç¨å¸¸éå®ä¹
- equals/hashCodeé 对éå
- equalsè°ç¨é¡ºåºæ£ç¡®
- å è£ ç±»æ¯è¾ä½¿ç¨equals
- POJO屿§ä½¿ç¨å è£ ç±»åï¼æ é»è®¤å¼
éåæä½
- subListæ£ç¡®ä½¿ç¨
- Arrays.asListä¸å¯ä¿®æ¹
- foreach䏿£ç¡®remove
- Map使ç¨entrySetéå
å¹¶åå®å ¨
- çº¿ç¨æ± æ£ç¡®å建
- SimpleDateFormat线ç¨å®å ¨
- Random使ç¨ThreadLocalRandom
- å¤çº¿ç¨å ±äº«èµæºå é
æ§å¶è¯å¥
- switchædefault
- if/whileæè±æ¬å·
- æ å¤å±åµå¥ï¼ç¨å«è¯å¥ï¼
注é䏿¥å¿
- ç±»/æ¹æ³æJavadoc注é
- æ¥å¿æä¸ä¸æä¿¡æ¯
- å¼å¸¸å¤çæ£ç¡®
é å¥å·¥å ·
IDEæä»¶
- IDEA: Alibaba Java Coding Guidelines
- Eclipse: Alibaba Java Coding Guidelines
Mavenæä»¶
<!-- CheckStyle -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<configLocation>checkstyle.xml</configLocation>
</configuration>
</plugin>
<!-- SpotBugs -->
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
</plugin>
CheckStyleè§å
åèé¿éè§èé ç½®checkstyle.xmlï¼
- 驼峰å¼å½å
- 大æ¬å·æ¢è¡è§å
- 缩è¿4ç©ºæ ¼
ç¸å ³èµæº
- é¿éå·´å·´Javaå¼åæå: https://developer.aliyun.com/article/1589859
- Alibaba Java Coding Guidelinesæä»¶: https://plugins.jetbrains.com/plugin/10032-alibaba-java-coding-guidelines
- GitHubä»åº: https://github.com/ataopro/ataopro-alibaba-java-coding-guidelines
æ´æ°æ¥å¿
v1.1.0 (2026-02-20)
- æ°å¢ä»£ç æ ¼å¼è§è详解
- å¢å MySQL建表è§è示ä¾
- å¢å å¼å¸¸å¤çæä½³å®è·µ
- å¢å æ¥å¿è§è示ä¾
- å®åå¿«éæ£æ¥æ¸ å
v1.0.0 (2026-02-20)
- åå§çæ¬
- åºäºé¿éå·´å·´Javaå¼åæåæ´ç
- å å«10å¤§ç« èæ ¸å¿è§è
çæå£°æ: æ¬æè½å 容æ´çèªé¿éå·´å·´Javaå¼åæåï¼ä» ä¾å¦ä¹ åè使ç¨ã ä½è : ataopro çæ¬: 1.1.0 许å¯è¯: MIT