Uncle Bob's formatting rules:

public class CodeAnalyzer implements JavaFileAnalysis {
    private int lineCount;
    private int maxLineWidth;
    private int widestLineNumber;
    private LineWidthHistogram lineWidthHistogram;
    private int totalChars;

    public CodeAnalyzer() {
        lineWidthHistogram = new LineWidthHistogram();

    public static List<File> findJavaFiles(File parentDirectory) {
        List<File> files = new ArrayList<File>();
        findJavaFiles(parentDirectory, files);
        return files;

    private static void findJavaFiles(File parentDirectory, List<File> files) {
        for (File file : parentDirectory.listFiles()) {
            if (file.getName().endsWith(".java"))
            else if (file.isDirectory())
                findJavaFiles(file, files);

    public void analyzeFile(File javaFile) throws Exception {
        BufferedReader br = new BufferedReader(new FileReader(javaFile));
        String line;
        while ((line = br.readLine()) != null)

    private void measureLine(String line) {
        int lineSize = line.length();
        totalChars += lineSize;
        lineWidthHistogram.addLine(lineSize, lineCount);

    private void recordWidestLine(int lineSize) {
        if (lineSize > maxLineWidth) {
            maxLineWidth = lineSize;
            widestLineNumber = lineCount;

    public int getLineCount() {
        return lineCount;

    public int getMaxLineWidth() {
        return maxLineWidth;

    public int getWidestLineNumber() {
        return widestLineNumber;

    public LineWidthHistogram getLineWidthHistogram() {
        return lineWidthHistogram;

    public double getMeanLineWidth() {
        return (double) totalChars / lineCount;

    public int getMedianLineWidth() {
        Integer[] sortedWidths = getSortedWidths();
        int cumulativeLineCount = 0;
        for (int width : sortedWidths) {
            cumulativeLineCount += lineCountForWidth(width);
            if (cumulativeLineCount > lineCount / 2)
                return width;
        throw new Error("Cannot get here");

    private int lineCountForWidth(int width) {
        return lineWidthHistogram.getLinesforWidth(width).size();

    private Integer[] getSortedWidths() {
        Set<Integer> widths = lineWidthHistogram.getWidths();
        Integer[] sortedWidths = (widths.toArray(new Integer[0]));
        return sortedWidths;


Vertical Formatting

  • Typically, 200 lines in one file.
  • Each blank line is a visual cue that identifies a new and separate concept.
  • Concepts that are closely related should be kept vertically close to each other.
    • Variables should be declared as close to their usage as possible.
    • If one function calls another, they should be vertically close and the caller should be above the callee, if at all possible.
  • Order: from high level to low level

Horizontal Formatting

  • Short lines is better (set max to 100 or 120).
  • Openness and Density, ex: return b*b - 4*a*c
  • Intendation: never let this go wrong.

Be a Team Player

Follow the team formatting guideline if there is one.