前言

假如有一天咱们要按代码量来算工资,那怎样才能写出一手漂亮的代码,一起兼顾代码行数和实践意义呢?

要在添加代码量的一起进步代码质量和可保护性,能否做到呢?

答案当然是能够,这可难不倒咱们这种摸鱼高手。

耐心看完,你必定有所收获。

如果按代码量算工资,也许应该这样写

正文

1. 完成更多的接口:

给每一个办法都完成各种“无关痛痒”的接口,比方SerializableCloneable等,实在做到不影响运用的一起添加了相当数量的代码。

为了这些代码量,其间带来的功能损耗当然是能够疏忽的。

public class ExampleClass implements Serializable, Comparable<ExampleClass>, Cloneable, AutoCloseable {
    @Override
    public int compareTo(ExampleClass other) {
        // 比较逻辑
        return 0;
    }
    // 完成 Serializable 接口的办法
    private void writeObject(ObjectOutputStream out) throws IOException {
        // 序列化逻辑
    }
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        // 反序列化逻辑
    }
    // 完成 Cloneable 接口的办法
    @Override
    public ExampleClass clone() throws CloneNotSupportedException {
        // 仿制目标逻辑
        return (ExampleClass) super.clone();
    }
    // 完成 AutoCloseable 接口的办法
    @Override
    public void close() throws Exception {
        // 封闭资源逻辑
    }
}

除了示例中的SerializableComparableCloneableAutoCloseable,还有Iterable

2. 重写 equals 和 hashcode 办法

重写 equalshashCode 办法绝对是上上策,不只添加了代码量,还为了让目标在持平性判别和散列存储时能更完美的工作,保证代码在处理目标持平性时更准确、更符合事务逻辑。

public class ExampleClass {
    private String name;
    private int age;
    // 重写 equals 办法
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        ExampleClass other = (ExampleClass) obj;
        return this.age == other.age && Objects.equals(this.name, other.name);
    }
    // 重写 hashCode 办法
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

如果按代码量算工资,也许应该这样写

3. 添加配置项和参数:

不要管能不能用上,梭哈就完了,问就是为了健壮性和拓展性。

public class AppConfig {
    private int maxConnections;
    private String serverUrl;
    private boolean enableFeatureX;
    // 新增配置项
    private String emailTemplate;
    private int maxRetries;
    private boolean enableFeatureY;
    // 写上结构函数和getter/setter
}

4. 添加监听回调:

给事务代码添加监听回调,比方履行前、履行中、履行后等各种Event,这儿举个完好的比方。

比方创建个 EventListener ,担任监听特定类型的事情,事情源则是产生事情的目标。通过EventListener 在代码中添加履行前、履行中和履行后的事情。

首先,咱们界说一个简略的事情类 Event

public class Event {
    private String name;
    public Event(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

然后,咱们界说一个监听器接口 EventListener

public interface EventListener {
    void onEventStart(Event event);
    void onEventInProgress(Event event);
    void onEventEnd(Event event);
}

接下来,咱们界说一个事情源类 EventSource,在履行某个事务办法时,触发事情告诉:

public class EventSource {
    private List<EventListener> listeners = new ArrayList<>();
    public void addEventListener(EventListener listener) {
        listeners.add(listener);
    }
    public void removeEventListener(EventListener listener) {
        listeners.remove(listener);
    }
    public void businessMethod() {
        Event event = new Event("BusinessEvent");
        // 告诉监听器:履行前事情
        for (EventListener listener : listeners) {
            listener.onEventStart(event);
        }
        // 模仿履行事务逻辑
        System.out.println("Executing business method...");
        // 告诉监听器:履行中事情
        for (EventListener listener : listeners) {
            listener.onEventInProgress(event);
        }
        // 模仿履行事务逻辑
        System.out.println("Continuing business method...");
        // 告诉监听器:履行后事情
        for (EventListener listener : listeners) {
            listener.onEventEnd(event);
        }
    }
}

现在,咱们能够完成具体的监听器类,比方 BusinessEventListener,并在其间界说事情处理逻辑:

public class BusinessEventListener implements EventListener {
    @Override
    public void onEventStart(Event event) {
        System.out.println("Event Start: " + event.getName());
    }
    @Override
    public void onEventInProgress(Event event) {
        System.out.println("Event In Progress: " + event.getName());
    }
    @Override
    public void onEventEnd(Event event) {
        System.out.println("Event End: " + event.getName());
    }
}

最终,咱们写个main函数来演示监听事情:

public class Main {
    public static void main(String[] args) {
        EventSource eventSource = new EventSource();
        eventSource.addEventListener(new BusinessEventListener());
        // 履行事务代码,并触发事情告诉
        eventSource.businessMethod();
        // 移除监听器
        eventSource.removeEventListener(businessEventListener);
    }
}

如此这般那般,代码量猛增,还顺带完成了事务代码的流程监听。当然这仅仅最粗陋的完成,实在环境必定要比这个复杂的多。

5. 构建通用工具类:

相同的,别管用不用的上,界说更多的办法,都是为了健壮性。

比方下面这个StringUtils,能够从ApacheCommons、SpringBoot的StringUtil或HuTool的StrUtil中拷贝更多的代码过来,美其名曰内部工具类。

public class StringUtils {
    public static boolean isEmpty(String str) {
        return str == null || str.trim().isEmpty();
    }
    public static boolean isBlank(String str) {
        return str == null || str.trim().isEmpty();
    }
    // 新增办法:将字符串反转
    public static String reverse(String str) {
        if (str == null) {
            return null;
        }
        return new StringBuilder(str).reverse().toString();
    }
    // 新增办法:判别字符串是否为整数
    public static boolean isInteger(String str) {
        try {
            Integer.parseInt(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
}

6. 添加新的反常类型:

添加更多反常类型,对不同的事务抛出不同的反常,每种反常都要单独去处理

public class CustomException extends RuntimeException {
    // 结构函数
    public CustomException(String message) {
        super(message);
    }
    // 新增反常类型
    public static class NotFoundException extends CustomException {
        public NotFoundException(String message) {
            super(message);
        }
    }
    public static class ValidationException extends CustomException {
        public ValidationException(String message) {
            super(message);
        }
    }
}
// 示例:添加不同类型的反常处理
public class ExceptionHandling {
    public void process(int value) {
        try {
            if (value < 0) {
                throw new IllegalArgumentException("Value cannot be negative");
            } else if (value == 0) {
                throw new ArithmeticException("Value cannot be zero");
            } else {
                // 正常处理逻辑
            }
        } catch (IllegalArgumentException e) {
            // 反常处理逻辑
        } catch (ArithmeticException e) {
            // 反常处理逻辑
        }
    }
}

7. 完成更多规划形式:

在项目中运用更多规划形式,也不失为一种合理的方法,比方单例形式、工厂形式、战略形式、适配器形式等各种常用的规划形式。

比方下面这个单例,大大节省了内存空间,虽然它存在线程不安全等问题。

public class SingletonPattern {
    // 单例形式
    private static SingletonPattern instance;
    private SingletonPattern() {
        // 私有结构函数
    }
    public static SingletonPattern getInstance() {
        if (instance == null) {
            instance = new SingletonPattern();
        }
        return instance;
    }
}

还有下面这个战略形式,能防止过多的if-else条件判别,降低代码的耦合性,代码的扩展和保护也变得更加简单。

// 战略接口
interface Strategy {
    void doOperation(int num1, int num2);
}
// 具体战略完成类
class AdditionStrategy implements Strategy {
    @Override
    public void doOperation(int num1, int num2) {
        int result = num1 + num2;
        System.out.println("Addition result: " + result);
    }
}
class SubtractionStrategy implements Strategy {
    @Override
    public void doOperation(int num1, int num2) {
        int result = num1 - num2;
        System.out.println("Subtraction result: " + result);
    }
}
// 上下文类
class Context {
    private Strategy strategy;
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    public void executeStrategy(int num1, int num2) {
        strategy.doOperation(num1, num2);
    }
}
// 测验类
public class StrategyPattern {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 5;
        // 运用加法战略
        Context context = new Context(new AdditionStrategy());
        context.executeStrategy(num1, num2);
        // 运用减法战略
        context = new Context(new SubtractionStrategy());
        context.executeStrategy(num1, num2);
    }
}

比照下面这段条件判别,高低立判。

public class Calculator {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 5;
        String operation = "addition"; // 能够根据事务需求动态设置运算方法
        if (operation.equals("addition")) {
            int result = num1 + num2;
            System.out.println("Addition result: " + result);
        } else if (operation.equals("subtraction")) {
            int result = num1 - num2;
            System.out.println("Subtraction result: " + result);
        } else if (operation.equals("multiplication")) {
            int result = num1 * num2;
            System.out.println("Multiplication result: " + result);
        } else if (operation.equals("division")) {
            int result = num1 / num2;
            System.out.println("Division result: " + result);
        } else {
            System.out.println("Invalid operation");
        }
    }
}

8. 扩展注释和文档:

假如要添加代码量,写更多更全面的注释也不失为一种方法。

/**
 * 这是一个示例类,用于展现添加代码数量的技巧和示例。
 * 该类包括一个示例变量 value 和示例结构函数 ExampleClass(int value)。
 * 通过示例办法 getValue() 和 setValue(int newValue),能够获取和设置 value 的值。
 * 这些办法用于展现如何添加代码数量,但实践上并未完成实践的事务逻辑。
 */
public class ExampleClass {
    // 示例变量
    private int value;
    /**
     * 结构函数
     */
    public ExampleClass(int value) {
        this.value = value;
    }
    /**
     * 获取示例变量 value 的值。
     * @return 示范变量 value 的值
     */
    public int getValue() {
        return value;
    }
    /**
     * 设置示例变量 value 的值。
     * @param newValue 新的值,用于设置 value 的值。
     */
    public void setValue(int newValue) {
        this.value = newValue;
    }
}

结语

哪怕是以代码量算工资,咱也得写出高质量的代码,合理合法合情的赚票子。

如果按代码量算工资,也许应该这样写