【问题标题】:Is there a way to efficiently audit statistics attributes of objects in Java?有没有办法有效地审计 Java 中对象的统计属性?
【发布时间】:2020-10-20 02:20:05
【问题描述】:

假设我有一个Person类,我创建了10个Person实例,每个人都有几个不同的属性,比如enum Gender{MALE, FEMALE}enum Profession{CEO, POLICE, TEACHER}等。

不知何故,我不得不随机创建许多具有随机属性的人,并使用专门的类来审核创建人属性的统计信息。

因此,最终,我需要生成一个属性列表,其中包含一些相应的统计信息,例如“FEMALE: [number], POLICE: [number],...”。

目前,我打算将各种人员的属性计数添加为审计类的一堆新属性,例如“femaleCount int,policeCount int,...”然后操作根据生成的人数进行计数。

但是,我为每个人获得了 10 种属性,所以我想知道是否有更好的方法来做到这一点。

感谢您的阅读。

【问题讨论】:

  • 你需要产生什么结果?
  • 创建Audit Class ... maybe Singleton,并将所有所需的统计信息作为参数,并将Audit object 更新为Persons objscreated/updated or deleted。始终 Audit 对象必须反映 allPersons 的当前统计信息
  • @PM 77-1 我需要先将所有出现的创建人属性的列表输出为字符串。
  • 您的输出是返回的屏幕还是需要传递给不同进程的对象?
  • @Traian GEICU 谢谢,我认为 Singleton 是避免将所有属性添加到构造函数中的好主意,但是,对于我的这个编程任务,不知何故我需要在我的审计中添加一个构造函数类。

标签: java statistics


【解决方案1】:

下面是一种可能的方法,但不要说它是唯一一种也不是最好的方法。
这仅取决于目的和您的设计。
其他选项可能是将所有 Persons 存储在数据结构 List 中,并在特定时间根据数据计算统计信息(也可以在此处更新/删除)

仅添加计数的版本...

public class Statistic
{
    
    private static Statistic s=null;
    public int countPerson;
    public int countMale;
    public int countFemale;
    public static Statistic getInstance()
    {
        if(s==null) 
            s =  new Statistic(0, 0, 0);
        return s;
    }
    public static Statistic getInstace(int cP,int cM, int cF)
    {
        if(s==null) 
            s = new Statistic(cP, cM, cF);
        return s;
    }
    //do whatever init wanted
    private Statistic(int cP,int cM, int cF)
    {
        countPerson = cP;
        countMale = cM;
        countFemale = cF;
    }
    
    public String toString()
    {
        return "Total="+countPerson+", Male="+countMale+", Female=" + countFemale;
    }
    
}

...

public class Person
{
    public int id;
    public String name;
    public Gender g;
    public Profession p;
    public enum Gender{MALE, FEMALE};
    public enum Profession{CEO, POLICE, TEACHER}
    Person(int id,String name, Gender g, Profession p)
    {
        this.id = id;
        this.name = name;
        this.g = g;
        this.p = p;
        Statistic.getInstance().countPerson++;
        if(g.equals(Gender.MALE))
        {
            Statistic.getInstance().countMale++;
        }
        else
        {
            Statistic.getInstance().countFemale++;
        }
    }
    
}

...

public class TestStat {

    public static void main(String[] args) 
    {
        //cPersons,cMale,cFemale - init
        Statistic.getInstace(10, 5, 5);
        System.out.println(Statistic.getInstance());
        new Person(1,"Male",Person.Gender.MALE, Person.Profession.TEACHER);
        System.out.println(Statistic.getInstance());
        new Person(2,"Female",Person.Gender.FEMALE, Person.Profession.CEO);
        System.out.println(Statistic.getInstance());
        
    }
}

输出

//custom start from (10,5,5) based on Singleton Custom Constructor
Total=10, Male=5, Female=5
//start update counters
Total=11, Male=6, Female=5
Total=12, Male=6, Female=6

三思而后行,在Singleton 上保留ListPersons 可能会更好 并让每次new Computation - 来自Singleton,而不是Person。 关于Delete 一个人,可以翻译为“从一家公司搬到另一家”,然后它不会反映在统计上。
即便如此,目前您可以在人员上添加delete method,这可以通过调整StatisticminusPerson-Instancenull 来反映。
此外,您可以根据需要更新设计。

【讨论】:

    猜你喜欢
    • 2020-01-21
    • 2022-01-16
    • 2021-01-28
    • 1970-01-01
    • 2020-06-02
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多