2015-09-05 2 views
0

У меня есть 7-8 классов, которые можно использовать, используя некоторые аналогичные функции, а также читать в том же списке и HashMap. Итак, я создал статический класс, содержащий все функции как статические функции и статический список и hashMap.Дизайн OO против статических классов в java и параллельной работе

Теперь у меня есть некоторые вопросы:

1.) Это неправильная практика, чтобы иметь статические классы в Java, как мой старший ругайте меня, используя статический класс и скорее просил меня, чтобы преобразовать его в одноэлементный класс ,

Но статические классы быстрее, чем одиночные. Не так ли?

2.) Плохая конструкция, чтобы иметь ссылку на статический/нестатический метод для получения некоторых данных, таких как список внутри метода вызова (в потоке) или для выполнения какой-либо задачи?

Нарушает ли безопасность нити или параллелизм, как сказал мой старший? И попросите меня иметь список внутри класса потока как частный член.

Но не так плохо использовать память, поскольку другие классы потоков 6-7 используют один и тот же список только для чтения.

3.) Как я могу улучшить дизайн OO с улучшением производительности.

примера код будет выглядеть следующим образом:

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

Нет «старшего» человек не будет рекомендовать Singleton. Я не вижу никакого преимущества в создании этого статического или синглтона. Если у вас есть изменяемые общие данные, вам лучше помнить о правильной синхронизации. Мне кажется, что ты беспокоишься о неправильном. – duffymo

ответ

2

метод, как это ужасная идея (плохое именование и неспособность следовать Java стандартов кодирования в стороне):

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

Вы возвращаете изменяемую ссылку, поэтому любой, кто получает этот список, может изменять его содержимое, поскольку они усмотрению. Частный больше не является частным.

Если вы должны вернуть ссылку на частный список или структуру данных (нет причин делать это, чтобы я мог видеть), вы должны либо сделать ее неизменной, либо вернуть копию.

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

У вас есть измененные общие данные без какой-либо синхронизации, поэтому этот класс не является потокобезопасным вообще.

1

Я думаю Singletons гораздо лучше, чем статические классы

Ниже ответы на ваш вопрос серийно:

1) Нет, это полностью зависит от ваших требований, но да статические классы быстрее, но и позволяет больше ошибок в проект

2) Да, иногда до тех пор, как его не затрагивая личные данные пользователей ваших и сделать ваши данные небезопасных

3) Использование синглтонов, поскольку она обеспечивает более ОО funtionalities и, таким образом, в складка производительность

Вот большая ссылка статья для вас:

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