Входя в систему Java и в целом: Лучшие практики?

@Chuck прав в том, что вы не можете конвертировать NSArray в varargs . Тем не менее, я не рекомендую искать шаблон %@ в строке и заменять его каждый раз. (Замена символов в середине строки, как правило, довольно неэффективна, и не очень хорошая идея, если вы можете выполнить то же самое другим способом.) Вот более эффективный способ создания строки в описываемом вами формате:

NSArray *array = ...
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSMutableArray *newArray = [NSMutableArray arrayWithCapacity:[array count]];
for (id object in array) {
    [newArray addObject:[NSString stringWithFormat:@"x=%@", [object description]]];
}
NSString *composedString = [[newArray componentsJoinedByString:@", "] retain];
[pool drain];

Я включил пул автоматического выпуска для хорошего обслуживания, так как автоматически выпускаемая строка будет создаваться для каждой записи массива, а изменяемый массив также автоматически освобождается. Вы можете легко превратить это в метод / функцию и вернуть composedString, не сохраняя его, и при желании обработать авторелиз в другом месте кода.

64
задан bnjmn 6 January 2014 в 19:27
поделиться

3 ответа

Ваши соглашения довольно стандартны и довольно хороши (imho).

Единственное, на что следует обратить внимание, - это фрагментация памяти из-за чрезмерных необработанных вызовов отладки, поэтому с Log4J (и большинством других платформ ведения журналов Java) , вы получите что-то вроде этого:

if (log.isDebugEnabled()) {
  log.debug("...");
}

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

Ведение журнала на уровне INFO не должно быть слишком "болтливый" (и из того, что вы говорите, похоже, что это не так). Сообщения INFO должны быть значимыми и значимыми, как запуск и остановка приложения. Вещи, которые вы, возможно, захотите узнать, если столкнетесь с проблемой. Ведение журнала отладки / точного уровня больше используется, когда у вас действительно есть проблема, которую вы пытаетесь диагностировать. Ведение журнала отладки / точного ведения журнала обычно включается только при необходимости. Информация обычно отображается постоянно.

Если кому-то не нужны конкретные сообщения INFO от ваших классов, он, конечно, может изменить вашу конфигурацию log4j, чтобы не получать их. Log4j очень прост в этом отделе (в отличие от ведения журнала Java 1.4).

Что касается вашего HTTP, я обычно не обнаружил, что это проблема с ведением журнала Java, потому что обычно один класс отвечает за то, что вы ' вас интересует, поэтому вам нужно только поместить его в одно место. В том случае (что редко по моему опыту), когда вам нужны общие сообщения журнала для, казалось бы, несвязанных классов, просто вставьте какой-нибудь токен, который можно легко найти.

они, конечно, могут изменить вашу конфигурацию log4j, чтобы не получать их. Log4j очень прост в этом отделе (в отличие от ведения журнала Java 1.4).

Что касается вашего HTTP, я обычно не обнаружил, что это проблема с ведением журнала Java, потому что обычно один класс отвечает за то, что вы ' вас интересует, поэтому вам нужно только поместить его в одно место. В том случае (что редко по моему опыту), когда вам нужны общие сообщения журнала для, казалось бы, несвязанных классов, просто вставьте какой-нибудь токен, который можно легко найти.

они, конечно, могут изменить вашу конфигурацию log4j, чтобы не получать их. Log4j очень прост в этом отделе (в отличие от ведения журнала Java 1.4).

Что касается вашего HTTP, я обычно не обнаружил, что это проблема с ведением журнала Java, потому что обычно один класс отвечает за то, что вы ' вас интересует, поэтому вам нужно только поместить его в одно место. В том случае (что редко по моему опыту), когда вам нужны общие сообщения журнала для, казалось бы, несвязанных классов, просто вставьте какой-нибудь токен, который можно легко найти.

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

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

38
ответ дан 24 November 2019 в 15:59
поделиться

Предпочтительным вариантом для описываемой вами конфигурации log4j является использование файла конфигурации log4j . Это позволяет пользователям вашей реализации делать именно то, что вы просите, поскольку они могут позже переопределить вашу конфигурацию чем-то более подходящим для своей собственной реализации. См. здесь для очень подробного руководства.

4
ответ дан 24 November 2019 в 15:59
поделиться

Я, наверное, где-то украл это, но это приятно.

Это снижает риск перепутать логгеры при копировании и пасти ^ h ^ h ^ h рефакторинге, и меньше набирать .

В вашем коде:

private final static Logger logger = LoggerFactory.make();

... и в LoggerFactory:

public static Logger make() {
    Throwable t = new Throwable();
    StackTraceElement directCaller = t.getStackTrace()[1];
    return Logger.getLogger(directCaller.getClassName());
}

(Обратите внимание, что дамп стека выполняется во время инициализации. Трассировка стека , вероятно, не будет оптимизирована JVM, но там фактически никаких гарантий)

4
ответ дан 24 November 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: