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

    +91

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    public static 
    	String readFile(String file) {
    		return Read.file(  Reflection.getCallerClass(2), file,"\n");
    	}
    	public static 
    	String readFile(Class c, String file, final String lineBreaker) {
    		return Read.stream(c.getResourceAsStream(file),lineBreaker);
    	}

    Я уже как-то раз наступил на эту хрень.
    Но ничё - сегодня снова вот решил написать - удобно ведь.

    Запостил: 3.14159265, 22 Октября 2012

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

    • Ох я как-то раз с этим sun.reflect.Reflection страшно себе в ногу выстрелил - не описать.
      А всё из-за желания секономить 1 параметр при вызове фабрики.
      Ответить
    • Как мне теперь это развидеть?
      Я по умолчанию использую контекстный загрузчик классов...
      Ответить
      • Зато у меня фабрика даже без параметров, сама знает какой объект отдать.
        Ответить
        • В чем суть этого говнокода? Кратко для неосиляторов.
          Ответить
          • метод использует информацию о типе того, кто его вызывает, для того, чтобы понять, откуда грузить ресурс
            Ответить
            • Мне это напоминает:
              >метод использует информацию о типе того, кто его вызывает, для того, чтобы понять, в какую ногу стрелять.

              Впрочем, у кого что болит...
              Ответить
              • Просто как-то раз один Тарас...
                давал сцылку на геймдев где предлагал программу с процедурами, которые ничего не возвращают.
                А вот я тут подумал - если и аргументы тоже не передавать.

                Ну и по старой-доброй традиции - расчет факториала без параметров.
                http://ideone.com/dIycnd
                Ответить
      • А использовалось оно примерно так:
        фабрика тянула ресурс, поднимала из него бин, начиняла и возвращала его. Удобно это тем, что настройки лежат прямо рядом с кодом, который их использует. В пику любителям контектов и всяких IoC.
        И причем бин мог быть любого типа.

        Трабла возникла лишь тогда, когда при рефакторинге вклинился лишний метод-прослойка с другого класса, в котором на беду тоже лежал файл с настройками. Кстати тот проект так и работает.
        Ответить
    • Дык там же под вторым номером что угодно может быть, не? Или я как-то не так посчитал?
      Ответить
      • The first frame is that associated with this method, so getCallerClass(0) returns the Class object for sun.reflect.Reflection.
        Получается что единичка - readFile, а двоечка - как раз тот кто его вызвал.
        Ответить
    • как-то и мне доводилось писать подобный загружатель ресурсов - от текущего класса.
      а потом ресурсы у меня перестали находиться.
      внимание, вопрос: почему?
      Ответить
      • Java Update Available
        Ответить
      • короче так.
        вариантов тут может быть несколько.
        <extrasence>
        ты вызвал из наследника (который в другом пакадже) метод родителя, и ожидал что оно возьмет ресурс наследника.
        </extrasence>

        Как я понимаю Class.getResourceAsStream попил много крови не только из меня.
        Ответить
        • > ты вызвал из наследника (который в другом
          пакадже) метод родителя, и ожидал что оно
          возьмет ресурс наследника.

          да, это была ощутимая оплеуха от этих ООПешных загрузчиков, именно подстава с наследованием.

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

          и наконец, версия, приближенная к предположению @roman-kashitsyn, я не мог загрузить ресурс из отдельного jarика

          это не считая таких мелочей, как сложности с получением пути пустого пакета (без класса), невозможность получить список этих ресурсов и т.д.
          Ответить
      • Пакет переименовали?
        Ответить
    • но после того я понял, что нефиг, и нужно задавать единый базовый класс, а ресурсы задавать путями от него в константах.
      однако библиотека моих попыток целовать Жабу в зад еще цела
      Ответить

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