有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何构造大型类?

我目前正在编写一个用于与设备通信的Java API。设备制造商提供的设备原始API是用C编写的,基本上只是一个大头文件,定义了与设备通信所需的每个结构、枚举和函数。很多这样的结构和函数实际上是用来更改设备设置或检索设备信息的

因为我将这个API移植到Java,所以我想让这个API更加面向对象,对于那些对设备及其C API没有实际知识的人来说更容易使用。我的目标是有一个类Device,它有从设备连接和检索数据的方法

现在我想知道我应该如何将所有的设置和信息融入课堂。如果我基本上对原始API做一个OO端口,那么这个类会变得非常大,因此更难使用。首先,我将所有设置信息放在自己的类中,并使该类成为我的Device类的成员。DeviceSettings类将引用其Device类连接对象(基本上是一个通过JNI/JNA处理与C API通信的对象)

现在看起来像这样:

class Device {
    private JNIDeviceConnection connection;

    private DeviceSettings settings;
    private DeviceInformation information;
    private SpecificDeviceSettingsA spSettingsA;
    ...

    public void connect();
    public void disconnect();
    public DataObject getData();

    public Device() {
        settings = new DeviceSettings(connection);
        ...
    }
}

使用该类将如下所示:

Device dev = new Device();
dev.connect();
dev.getDeviceSettings().changeSettingA(newValue);
dev.getData();
dev.disconnect();

你认为这是解决这类问题的好方法吗?我觉得这门课做得太多了,但我宁愿让这门课做得太多,也不愿做这样的事情:

Device dev = new Device()
dev.connect()
DeviceSettingsUtility.changeSettingsA(dev, newValue);
...

我是否错过了一个明显更好的选择


共 (2) 个答案

  1. # 1 楼答案

    如果我要构建这个,我会做下面这样的事情:

    型号:

    //With getter and setter and other details
    
    Device : composed of {DeviceSettings, DeviceInformation}
    DeviceSettings:
    DeviceInformation:
    

    经理/服务:

    ConnectionManager:
                    |
                    -getCnnection(Device device)
    DeviceManager:
                 |
                 - connect(Device device)
                 - disconnect(Device device)
                 - changeSettings(Device device)
    

    用法:

    DeviceManager.changeSettings(device, setting){
      //get the current setting and update
    }
    
  2. # 2 楼答案

    我的两分钱:不要那样做

    不要把一个单一的/静态的类整合到java代码中,只是为了模仿一些古老的C API。因为:这几乎没有任何价值。并将立即成为维护的噩梦

    没有一个严肃的java程序员愿意使用你的新“产品”;如果没有真正的收益,任何一个认真的C程序员都不会认为有必要转向一种新的语言

    长话短说:不要浪费时间“复制”已经存在的东西。相反,要理解需求;并设计一个干净、易于使用、最先进的API,它有可能吸引人们(以及其他长期支持您的维护人员)。意思是:完全面向对象,提供合理的抽象,等等