1. Java / Говнокод #9702

    +142

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    /**
     * Конфигурация программы
     *
                 *  2 конструктора:
                    - по умолчанию - загружающий данные из файла настроек (см. Configuration.CONFIGURATION_FILENAME);
                    - с одним параметром java.util.Properties - загружающий данные данные из него.
                - метод save()
                    - без параметра - записывает данные в Configuration.CONFIGURATION_FILENAME
                    - с одним параметром java.util.Properties - записывает данные в него.
     */
    public class Configuration {
        public static final String CONFIGURATION_FILENAME = System.getProperty("user.home") + "/serialmon/1.properties";
        private PortConfig firstPort;
    	private PortConfig secondPort;
        private String logFileName;
        private int logWidth;
        
    	public Configuration() {
            this.firstPort = new PortConfig();
            this.secondPort = new PortConfig();
            
            Properties pp = new Properties();
            try {
                File PropFile = new File(CONFIGURATION_FILENAME);
                if (!PropFile.exists()) {   
                    PropFile.createNewFile();
                }
                FileInputStream inPropFile = new FileInputStream(CONFIGURATION_FILENAME); 
                pp.load(inPropFile);          
                setProperties(pp);           
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public Configuration(Properties p) {
            
            this.firstPort = new PortConfig();
            this.secondPort = new PortConfig();
            
            setProperties(p);
        }
        
        /**
         * вспомогательный метод. В идеале можно было обойтись без него, вызывая из конструктора по умолчанию
         * конструктор с параметром Properties, но ПЕРЕД вызовом этого конструктора нужно было
         * загрузить данные из файла в Properties pp, а потом уже вызвать конструктор.
         * Это сделать не возможно, т.к. вызов конструктора должен быть ПЕРВЫМ.
         * 
         * @param pp 
         */
        private void setProperties(Properties pp){
            
            this.setLogFileName(pp.getProperty("logFileName"));
            this.setLogWidth(Integer.parseInt(pp.getProperty("logWidth")));
        }
        
        /**
         * - метод save()
         * без параметра - записывает данные в Configuration.CONFIGURATION_FILENAME
         */
        public void save() {
            
            Properties pp = new Properties();
            save(pp);
            
            try {
                FileOutputStream outPropFile = new FileOutputStream(CONFIGURATION_FILENAME);
                pp.store(outPropFile, null);
                
            } catch(IOException ex) {
                ex.printStackTrace();
            }
        }
        
        /**
         *     - с одним параметром java.util.Properties - записывает данные в него.
         * 
         * @param p 
         */
        public void save(Properties p) {
            
            p.put("logFileName", this.getLogFileName());
            p.put("logWidth", String.valueOf(this.getLogWidth()));
        }

    Товарищи, возникла необходимость создания двух конструкторов. Хочется вызвать один из другого, чтобы было красиво, НО перед вызовом второго, который с параметром Properties, нужно установить этот самый параметр, а потом уже передать его.
    Т.е. нужно в конструкторе по умолчанию сделать такое:
    Properties p = new Properties();
    p.set(бла бла бла);
    THIS(P); // как вы понимаете, компилятор будет ругаться, что вызов THIS должен быть ПЕРВЫМ в конструкторе.

    вызов типа this(new Properties), не годится.

    сейчас, как можно видеть, использую вспомогательный метод setProperties, как раз без которого было бы идеально.

    Запостил: kikis, 18 Марта 2012

    Комментарии (10) RSS

    • Уважаемый, вы слегка ошиблись ресурсом... тут не консультируют, тут лулзами делятся. Но идея говно, подтверждаю.
      Ответить
      • пока еще не достиг дзена, чтоб над кодом смеяться
        Ответить
        • Ну тогда сделайте либо как советует tir ниже, либо без статики - вынесите код инициализации в отдельный приватный метод. Второй подход удобнее при дальнейшем наследовании - легче изменить поведение.
          Ответить
    • вынеси код по загрузке properties в статичный метод типа
      private static Properties loadProperties() {...}

      и тогда сможешь сделать
      public Properties() {
         super(loadProperties());
      }
      Ответить
      • неа, не сможет, компилер будет причитать и жаловаться, что вперед батьки в пекло loadProperties() раньше конструктора вызовется.

        элегантным решением была бы именно фабрика.
        Ответить
    • Именно поэтому я так люблю использовать фабричные методы: до вызова конструктора можно выполнить все проверки и сделать дополнительную работу. пожалуйста, не пишите комменты на русском...
      Ответить
    • > serialmon
      луна в матроске
      Ответить
    • > e.printStackTrace();
      Просто перестань писать на яве.
      Ответить

    Добавить комментарий