OO设计与java中的静态类和并发利用

时间:2015-09-05 16:02:09

标签: java multithreading oop concurrency

我有7-8个可调用类,它们使用了一些类似的功能,并且还读取了一些相同的列表和HashMap。 所以我创建了一个静态类,其中包含静态函数和静态列表以及hashMap的所有功能。

现在,我有一些疑问:

1。)在java中使用静态类是不正确的做法,因为我的大四学生骂我使用静态类,而是让我把它转换成单例类。

但是静态类比单例更快。不是吗?

2。)引用静态/非静态方法获取调用方法(在线程中)列表中的某些数据或执行某些任务是不是一个糟糕的设计?

这是否违反了我的大四学生所说的线程安全性或并行性?并要求我将线程类中的列表作为私有成员。

但是对于内存的使用并不是很糟糕,因为其他6-7个线程类使用相同的列表来进行只读。

3。)如何通过提高性能来改进面向对象设计。

示例代码如下所示:

public class StaticClass {
    private static List<String> ListOne;
    private static List<String> listTwo;
    private static HashMap<String, String> hMap;

    static{
        //initialize list and maps by reading from file
    }


    public static List<String> getListOne() {
        return ListOne;
    }
    public static List<String> getListTwo() {
        return listTwo;
    }
    public static HashMap<String, String> gethMap() {
        return hMap;
    }

    public static void commonMethodOne(){

    }

    public static String commonMethodTwo(){

        }

    public static String[] commonMethodThree(){

    }

}

public class CallableThread implements Callable<String>{

    public String call(){

        HashMap<String, String> mapTask = StaticClass.gethMap();
        List<String> taskOne =StaticClass.getListOne();

        for(String temp : taskOne){
            //do what you are suppose to do
        }
        for(String key : mapTask.keySet()){
            //do what you are supposed to do
        }
        return "Done with CallableThread";
    }
}

2 个答案:

答案 0 :(得分:2)

这样的方法是一个糟糕的想法(命名不佳并且不遵循Java编码标准):

public static List<String> getListOne() {
    return ListOne;
}

您返回一个可变引用,因此获取此List的任何人都可以根据需要修改其内容。私人不再是私人的。

如果必须返回对私有列表或数据结构的引用(没有理由这样做,我可以看到),您应该使其不可变或返回副本。

public static List<String> getListOne() {
    return Collections.unmodifiableList(ListOne);
}

你有可变的共享数据而没有任何类型的同步,所以这个类根本不是线程安全的。

答案 1 :(得分:1)

我认为单身人士比静态课程好得多

以下是您的问题的连续答案:

1)不,这完全取决于您的要求,但是静态类更快,但也允许更多错误进入您的项目

2)有时只要不影响您的私人数据成员并使您的数据不安全

3)使用单身,因为它提供了更多的OO功能,从而提高了性能

以下是一篇很棒的参考文章:

http://javarevisited.blogspot.in/2013/03/difference-between-singleton-pattern-vs-static-class-java.html