java-refactoring-extract-method — GitHub Copilot skill
This skill guides Extract Method refactoring for complex Java methods while preserving behaviour. Use it when a method needs smaller, focused units backed by tests.
npx skills add github/awesome-copilot --skill java-refactoring-extract-methodWhat java-refactoring-extract-method does
The skill applies Extract Method refactoring to Java code. It looks for candidates such as methods over 15 lines, with over 10 statements, or cyclomatic complexity above 10, then moves cohesive blocks into clearly named methods that match the project’s Java level and style.
It asks for the narrowest green test command before changes and reruns checks after every extraction. If the baseline is red, or the code has no tests, it stops and calls for characterization tests first. Functional logic, exception behaviour, side-effect order, and the original method’s visibility must stay intact.
New extracted methods default to private. The guidance covers changed local variables, checked exceptions, control-flow statements, plus risks in synchronized and transaction-annotated methods. Install it for reviewable Java refactors with test coverage; skip it if you expect it to alter untested code anyway.
What it helps with
- extract a cohesive block from a long Java method
- preserve behaviour during Extract Method refactoring
- run tests before and after each extraction
- handle local variables and checked exceptions
- avoid edits to generated code without approval
Example prompts for the agent
- “Find high-complexity Java methods and apply Extract Method.”
- “Run `./gradlew test --tests MyTest` first, then extract one cohesive block.”
- “Review this `synchronized` method and suggest a safe extraction.”
How to install java-refactoring-extract-method
1Skills CLI (Vercel)
npx skills add github/awesome-copilot --skill java-refactoring-extract-method2GitHub CLI
gh skill install github/awesome-copilot java-refactoring-extract-method3Manually: put the files in place
.github/skills/java-refactoring-extract-method/SKILL.md1Skills CLI (Vercel)
npx skills add github/awesome-copilot --skill java-refactoring-extract-method -a claude-code2Manually: put the files in place
~/.claude/skills/java-refactoring-extract-method/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/java-refactoring-extract-method/
Manually: put the files in place
.agents/skills/java-refactoring-extract-method/SKILL.mdFor all projects use ~/.agents/skills/
Manually: put the files in place
.cursor/skills/java-refactoring-extract-method/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
Platform CLI
gemini skills install https://github.com/github/awesome-copilot --path skills/java-refactoring-extract-methodManually: put the files in place
.devin/skills/java-refactoring-extract-method/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set554
The whole set →Similar
Questions about java-refactoring-extract-method
How do I install java-refactoring-extract-method in GitHub Copilot?
Run npx skills add github/awesome-copilot --skill java-refactoring-extract-method. You can also use gh skill install github/awesome-copilot java-refactoring-extract-method.
What does java-refactoring-extract-method do?
The skill guides GitHub Copilot through Java Extract Method refactoring. It keeps the original behaviour intact and asks to validate changes with compilation and tests.
Why does the skill stop when tests are missing or the baseline is red?
It asks for characterization tests first or for the baseline to be fixed. The skill does not permit deleting or weakening existing tests.
Source text
SKILL.md · MIT
---
name: java-refactoring-extract-method
description: 'Refactoring using Extract Methods in Java Language'
---
# Refactoring Java Methods with Extract Method
## Role
You are an expert in refactoring Java methods.
Below are **2 examples** (with titles code before and code after refactoring) that represents **Extract Method**.
## Code Before Refactoring 1:
```java
public FactLineBuilder setC_BPartner_ID_IfValid(final int bpartnerId) {
assertNotBuild();
if (bpartnerId > 0) {
setC_BPartner_ID(bpartnerId);
}
return this;
}
```
## Code After Refactoring 1:
```java
public FactLineBuilder bpartnerIdIfNotNull(final BPartnerId bpartnerId) {
if (bpartnerId != null) {
return bpartnerId(bpartnerId);
} else {
return this;
}
}
public FactLineBuilder setC_BPartner_ID_IfValid(final int bpartnerRepoId) {
return bpartnerIdIfNotNull(BPartnerId.ofRepoIdOrNull(bpartnerRepoId));
}
```
## Code Before Refactoring 2:
```java
public DefaultExpander add(RelationshipType type, Direction direction) {
Direction existingDirection = directions.get(type.name());
final RelationshipType[] newTypes;
if (existingDirection != null) {
if (existingDirection == direction) {
return this;
}
newTypes = types;
} else {
newTypes = new RelationshipType[types.length + 1];
System.arraycopy(types, 0, newTypes, 0, types.length);
newTypes[types.length] = type;
}
Map<String, Direction> newDirections = new HashMap<String, Direction>(directions);
newDirections.put(type.name(), direction);
return new DefaultExpander(newTypes, newDirections);
}
```
## Code After Refactoring 2:
```java
public DefaultExpander add(RelationshipType type, Direction direction) {
Direction existingDirection = directions.get(type.name());
final RelationshipType[] newTypes;
if (existingDirection != null) {
if (existingDirection == direction) {
return this;
}
newTypes = types;
} else {
newTypes = new RelationshipType[types.length + 1];
System.arraycopy(types, 0, newTypes, 0, types.length);
newTypes[types.length] = type;
}
Map<String, Direction> newDirections = new HashMap<String, Direction>(directions);
newDirections.put(type.name(), direction);
return (DefaultExpander) newExpander(newTypes, newDirections);
}
protected RelationshipExpander newExpander(RelationshipType[] types,
Map<String, Direction> directions) {
return new DefaultExpander(types, directions);
}
```
## Safety Rules
- Behaviour-preserving only: no functional change, no removed logic, no changed exceptions, side-effect order or visibility of the original method.
- Baseline first: run the narrowest green test command for the code (`./mvnw -q -Dtest=MyTest test`, `./gradlew test --tests MyTest`) or `./mvnw verify` / `./gradlew build`. Re-run it after every extraction. If the baseline is red, stop and report.
- If the code has no tests, stop and report; propose characterization tests first. Never delete or weaken tests.
- One extraction per step (one commit each when the user asks for commits) so each is reviewable and revertible.
- Prefer the IDE refactoring: use an available IDE tool that exposes Extract Method (it handles parameters and return values safely). The Copilot CLI `lsp` tool offers navigation and rename but no code actions, so configuring jdtls through `lsp-setup` does not provide it; otherwise extract by hand and validate with the compiler and tests.
- Extracted methods are `private` by default. Do not add public/protected methods, change the existing signature, or touch generated code (`target/`, `build/generated`, `@Generated`) without asking the user.
- Watch for: local variables modified in the block (return a value or introduce a small result type), multiple results, checked exceptions, `return`/`break`/`continue` inside the block, and `synchronized`/transaction-annotated methods (extracted `private` methods called on `this` bypass Spring proxies and AOP).
## Task
Apply **Extract Method** to improve readability, testability, cohesion and consistency.
1. Identify candidate methods (rough guide: > 15 lines, > 10 statements or cyclomatic complexity > 10) and cohesive blocks inside them.
2. Extract each block into a descriptively named method, following the existing code style and the project's Java level (check `maven.compiler.release` / toolchain; do not use newer syntax).
3. Add a one-line comment above each new method only if its name does not already convey its purpose.
4. Compile and run the tests; report the methods changed, the commands run and their results.
Output complete, compilable code for each changed method.
## Code to be Refactored:
Now, assess all methods with high complexity and refactor them using **Extract Method**
© github · MIT · github/awesome-copilot