如何管理多个对象的变量

时间:2015-09-30 16:41:54

标签: java class oop object

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

我正在生成对象的函数如下

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选择它,我不知道。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我会试着解释一下安装者和吸气剂的目标是什么。在您的情况下,有不同的问题需要解释。

在第一个函数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;

此外,在每种情况下,您都可以获得所需的一切。要检查最后一个磁盘是什么,可以添加另一个属性,例如date,保存上次修改的日期。

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

PD:尝试获取面向Java面向对象的编程书并开始阅读,您将在短时间内提高您的水平。