【问题标题】:How to manage variables for multiple objects如何管理多个对象的变量
【发布时间】:2015-12-28 13:22:36
【问题描述】:

我正在尝试为每个对象分配属性。我无法修改 Sigar 库的 FileSystemUsage 类,所以我不得不创建另一个类来管理属性。

我生成对象的函数如下

private String getDiskUsage() {
    try {
        List<FileSystem> result = new ArrayList<FileSystem>();
        org.hyperic.sigar.FileSystem[] fss = null;
        fss = sig.getFileSystemList();
        List<Integer> diskUsage = new ArrayList<Integer>();
        String ioStat = "";
        DiskMembers diskm = new DiskMembers();
        for (int i = 0; i<fss.length; i++) {
            FileSystem fs = fss[i];
            if (fs.getType()==2) {
                FileSystemUsage usage = sig.getFileSystemUsage(fs.getDirName());                    
                if (diskm.getlastDiskCheck(i - 1) != 0) {
                    long diff = (nanoTime() - diskm.getlastDiskCheck(i - 1)) / 1000000;
                    long diffRead = usage.getDiskReadBytes() - diskm.getLastDiskRead(i - 1);
                    long diffWrite = usage.getDiskWriteBytes() - diskm.getlastDiskWrite(i - 1);
                    ioStat = String.format("(%d/%d kB/s)", diffRead / diff, diffWrite / diff);
                }
                diskm.setLastDiskRead(i, usage.getDiskReadBytes());
                diskm.setlastDiskWrite(i, usage.getDiskWriteBytes());
                diskm.setlastDiskCheck(i, nanoTime());
                diskUsage.add((int) (usage.getUsePercent() * 100));
            }
        }
        return String.format("%d%% %s", (Collections.max(diskUsage)), ioStat);

    } catch (SigarException e) {
        e.printStackTrace();
    }
    return "n/a";
}

我为管理每个对象的属性创建的类如下

class DiskMembers{
private long[] lastDiskCheck = new long[5];
private long[] lastDiskRead = new long[5];
private long[] lastDiskWrite = new long[5];

public DiskMembers(){
    this.lastDiskCheck[0] = 0;
    this.lastDiskRead[0] = 0;
    this.lastDiskWrite[0] = 0;
}
public boolean setLastDiskRead(int i, long value){
    this.lastDiskRead[i] = value;
    return true;
}
public boolean setlastDiskCheck(int i,long value){
    this.lastDiskCheck[i] = value;
    return true;
}
public boolean setlastDiskWrite(int i,long value){
    this.lastDiskWrite[i] = value;
    return true;
}
public long getLastDiskRead(int i){
    if (i==-1)
        return this.lastDiskRead[0];
    return this.lastDiskRead[i];
}
public long getlastDiskCheck(int i){
    if (i==-1)
            return this.lastDiskCheck[0];
    return this.lastDiskCheck[i];
}
public long getlastDiskWrite(int i){
    if (i==-1)
        return this.lastDiskWrite[0];
    return this.lastDiskWrite[i];
}
}    

问题是我无法将每个对象的属性分开。我的意思是当生成对象使用时,我通过调用 diskm.getlastDiskCheck(i-1) 检查 lastDickCheck 变量。第一次它不会执行这部分代码,因为返回值为零(0)。但在那之后,我每次都会执行它,即使是不同的对象,只要它们的数组是。我想为每个(磁盘)的每个对象“使用”记录“lastdiskcheck”。

如果我更新磁盘 C 的 lastDiskCheck 变量:它也会为磁盘 D 拾取它,我不知道。

我该怎么做?

【问题讨论】:

  • 为什么不创建一个 DiskMembers 数组并以这种方式对其进行跟踪?
  • 如果我将它添加到循环中。它每次都会创建一个新集,我将无法获取我放入 lastdiskcheck 变量的最后一个条目。我会吗?
  • 这些是数组,你是什么意思?可以举个例子吗?
  • 那么,你为什么要创建一个由 5 个磁盘组成的阵列?您想为每个对象管理 5 个磁盘吗?确实我不太了解你的目标,告诉我,我想尽力帮助你。
  • 不,我不想为每个对象创建五个 5 个磁盘。那是我在做什么吗?我想要的只是检查每个磁盘(C:、D:、E:)并记下它的读/写/检查时间。下次如果执行同一个磁盘,我想检查其最后一次读取/写入/检查时间以计算差异,我将其放入 ioStat 变量中。

标签: java class oop object


【解决方案1】:

我将尝试向您解释 setter 和 getter 的目标是什么。在你的情况下,有不同的问题需要解释。

在您的第一个函数 getDiskUsage 中,有一个私有方法。您只能从同一类访问此方法。不知道是不是你的目标。

此外,如果你想访问三个不同的磁盘,我会实例化 3 三个不同的对象,例如: DiskMembers[] disks = new DiskMembers[3]; //C D 和 E

在这种情况下,对于每个对象,您都将访问 getter/setter。您的 DiskMembers 类的属性应该是:

private boolean _DiskCheck;
private boolean _DiskRead;
private boolean _DiskWrite;

每次修改磁盘时,访问方式如下:disks[0].set_DiskCheck() = true;

此外,在每种情况下,您都会拥有您想要的一切。要检查最后一个磁盘是什么,您可以添加另一个属性,如日期,您可以在其中保留最后修改的日期。

最后,我建议确保 setter 方法只保留值,而不是返回值。另一方面,您将拥有 getter,它返回私有属性的值。另一个重要的事情是,如果您需要创建一个复杂的 setter,最好创建更多可以使用此 setter 访问的方法。

PD:试着弄一本Java面向对象编程的书开始读吧,你会在短时间内提高你的水平。

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多