当前位置:首页 > Java

java如何设计类

2026-03-04 00:54:37Java

设计类的核心原则

面向对象编程(OOP)的核心思想包括封装、继承、多态和抽象。设计类时应遵循这些原则,确保代码的可维护性和扩展性。

封装数据与行为

将数据(属性)和操作数据的方法(行为)绑定在一个类中,通过访问修饰符控制外部访问权限。私有属性通过公有方法暴露必要操作。

public class BankAccount {
    private double balance;

    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    public double getBalance() {
        return balance;
    }
}

单一职责原则

每个类应只负责一项明确的功能。避免创建"全能类",将不同功能拆分到多个类中。

// 违反原则的示例
class UserManager {
    void saveUser() { /* 数据库操作 */ }
    void sendEmail() { /* 邮件逻辑 */ }
}

// 改进方案
class UserRepository {
    void saveUser() { /* 仅处理存储 */ }
}

class EmailService {
    void sendEmail() { /* 仅处理邮件 */ }
}

使用继承建立层次结构

通过extends关键字实现类继承,子类复用父类属性和方法。抽象类定义通用行为,具体子类实现细节。

java如何设计类

abstract class Animal {
    abstract void makeSound();
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}

接口实现多态

定义接口规范行为,不同类实现相同接口可互换使用。优先使用接口而非具体实现类作为参数类型。

interface Drawable {
    void draw();
}

class Circle implements Drawable {
    public void draw() {
        System.out.println("Drawing circle");
    }
}

class Canvas {
    void render(Drawable d) {
        d.draw();
    }
}

组合优于继承

通过持有其他类实例实现功能复用,比继承更灵活。使用final类防止不必要的继承。

class Engine {
    void start() { /* 引擎启动 */ }
}

class Car {
    private final Engine engine;

    Car(Engine engine) {
        this.engine = engine;
    }

    void start() {
        engine.start();
    }
}

不可变对象设计

对于值对象,设计为不可变类能提高线程安全性。所有字段设为final,不提供修改方法。

java如何设计类

public final class Money {
    private final double amount;
    private final String currency;

    public Money(double amount, String currency) {
        this.amount = amount;
        this.currency = currency;
    }

    // 只有getter没有setter
}

静态工厂方法

替代构造器提供更清晰的实例创建方式,可隐藏实现类或缓存实例。

class Complex {
    private final double real;
    private final double imaginary;

    private Complex(double r, double i) {
        real = r;
        imaginary = i;
    }

    public static Complex fromCartesian(double r, double i) {
        return new Complex(r, i);
    }

    public static Complex fromPolar(double modulus, double angle) {
        return new Complex(modulus*Math.cos(angle), modulus*Math.sin(angle));
    }
}

构建者模式

对于多参数构造,使用构建者模式提高可读性和灵活性。

class NutritionFacts {
    private final int servingSize;
    private final int calories;

    public static class Builder {
        private final int servingSize;
        private int calories = 0;

        public Builder(int servingSize) {
            this.servingSize = servingSize;
        }

        public Builder calories(int val) {
            calories = val;
            return this;
        }

        public NutritionFacts build() {
            return new NutritionFacts(this);
        }
    }

    private NutritionFacts(Builder builder) {
        servingSize = builder.servingSize;
        calories = builder.calories;
    }
}

依赖注入

通过构造函数或setter方法注入依赖对象,提高可测试性和松耦合。

class UserService {
    private final UserRepository repository;

    public UserService(UserRepository repository) {
        this.repository = repository;
    }

    public User getUser(int id) {
        return repository.findById(id);
    }
}

标签: java
分享给朋友:

相关文章

如何运行java文件

如何运行java文件

运行Java文件的方法 确保已安装Java Development Kit (JDK),可通过命令行输入java -version和javac -version验证安装。 编写Java代码并保存为.…

java如何输出数组

java如何输出数组

输出数组的方法 在Java中,输出数组内容有多种方式,具体取决于数组类型和输出格式需求。以下是几种常见的方法: 使用Arrays.toString()方法 适用于一维数组,直接调用Arrays.to…

如何搭建java环境

如何搭建java环境

下载JDK 访问Oracle官网或OpenJDK官网下载适合操作系统的JDK安装包。推荐选择长期支持版本(如JDK 17或JDK 21)。 安装JDK 运行下载的安装程序,按照向导完成安装。注意…

java如何实现异步

java如何实现异步

Java实现异步的方法 Java中实现异步编程可以通过多种方式,每种方式适用于不同的场景和需求。以下是常见的实现方法: 使用Thread类 创建新线程执行异步任务是最基础的方式。通过继承Thread…

java如何避免死锁

java如何避免死锁

避免死锁的方法 固定顺序获取锁 确保所有线程按照相同的顺序获取多个锁。例如,若需要获取锁A和锁B,所有线程必须先获取A再获取B,避免交叉依赖导致的死锁。这种方式破坏了“循环等待”条件。 使用锁超时机…

如何启用java

如何启用java

启用 Java 的方法 检查 Java 是否已安装 在命令行或终端输入 java -version,如果显示版本信息,说明 Java 已安装。若未安装,需从 Oracle 官网 或 OpenJDK 下…