Экземпляр внутреннего класса создается, когда создается экземпляр внешнего класса. Поэтому члены и методы внутреннего класса имеют доступ к членам и методам экземпляра (объекта) внешнего класса. Когда экземпляр внешнего класса выходит за пределы области видимости, также исчезают внутренние экземпляры классов.
Статический вложенный класс не имеет конкретного экземпляра. Он просто загружается, когда он используется в первый раз (как и статические методы). Это полностью независимая сущность, методы и переменные которой не имеют доступа к экземплярам внешнего класса.
Статические вложенные классы не связаны с внешним объектом, они быстрее, и они не 't взять память кучи / стека, потому что не нужно создавать экземпляр такого класса. Поэтому эмпирическое правило состоит в том, чтобы попытаться определить статический вложенный класс с максимально возможной областью (private> = class> = protected> = public), а затем преобразовать его во внутренний класс (удалив «статический» идентификатор) и ослабить объем, если это действительно необходимо.
Если необходимо использовать их, используют капиталы, это привлекает внимание им и одиночным играм их из того, чтобы быть по ошибке интерпретируемым как имена "Класса". Привлечение внимания к ним обладает дополнительным преимуществом привлечения чьего-то внимания, которое придет и осуществит рефакторинг Ваш код и удалит их. ;)
Я не понимаю, где это "не использует маркировки" правило, прибывает из. При выполнении нетривиальной логики цикличного выполнения тест, чтобы повредиться или продолжиться не всегда аккуратно в конце окружающего блока.
outer_loop:
for (...) {
// some code
for (...) {
// some code
if (...)
continue outer_loop;
// more code
}
// more code
}
Да, случаи как это действительно происходят все время. Что люди предлагают, чтобы я использовал вместо этого? Булево условие как это?
for (...) {
// some code
boolean continueOuterLoop = false;
for (...) {
// some code
if (...) {
continueOuterLoop = true;
break;
}
// more code
}
if (continueOuterLoop)
continue;
// more code
}
Фу! Рефакторинг его, поскольку метод не облегчает это также:
boolean innerLoop (...) {
for (...) {
// some code
if (...) {
return true;
}
// more code
}
return false;
}
for (...) {
// some code
if (innerLoop(...))
continue;
// more code
}
Уверенный это немного более симпатично, но это все еще раздает лишнюю булевскую переменную. И если внутренний цикл изменил локальные переменные, осуществление рефакторинг его в метод является не всегда правильным решением.
Итак, почему Вы все против маркировок? Приведите мне некоторые веские причины и практические альтернативы для вышеупомянутого случая.
Конвенция состоит в том, чтобы избежать маркировок в целом.
существуют очень, очень немного допустимых причин использовать маркировку для того, чтобы убегать из цикла. Вспыхивание в порядке, но можно устранить необходимость повредиться вообще путем изменения дизайна немного. В примере Вы дали, Вы извлекли бы 'Много кода' разделы и поместили бы их в отдельные методы с понятными именами.
for ( ;/*stuff*/; )
{
lotsOfCode();
if ( !isEnough() )
{
moreCode();
}
}
<час> Редактирование: видевший фактический рассматриваемый код ( здесь ), я думаю, что использование маркировок является, вероятно, лучшим способом сделать код читаемым. В большинстве случаев использование маркировок является неправильным подходом в этом экземпляре, я думаю, что это прекрасно.
Стиль кода Java Sun, кажется, предпочитает называть маркировки таким же образом как переменные, означая Camel-регистр с первой буквой в нижнем регистре.
Поскольку маркировки так редко полезны, это появляется, что нет никакой четкой конвенции. Спецификация языка Java имеет один пример с маркировками, и они находятся в non_cap.
, Но так как они так редки, по-моему, это является лучшим, для размышления дважды, являются ли они действительно правильным инструментом.
И если они - правильный инструмент, сделайте их всеми заглавными буквами так, чтобы другие разработчики (или Вы позже) поняли их как что-то необычное сразу же. (как Craig уже указал)
пример кода wrt sadie's :
Вы дали
outerloop:
for (...) {
// some code
for (...) {
// some code
if (...)
continue outerloop;
// more code
}
// more code
}
Как пример. Вы делаете правильное замечание. Мое лучшее предположение было бы:
public void lookMumNoLabels() {
for (...) {
// some code
doMoreInnerCodeLogic(...);
}
}
private void doMoreInnerCodeLogic(...) {
for (...) {
// some code
if (...) return;
}
}
, Но были бы примеры, где такой рефакторинг не находится правильно с любой логикой, Вы делаете.
Конвенция, которую я больше всего видел, является просто Camel-регистром, как имя метода...
myLabel:
, но я также видел маркировки, снабженные префиксом подчеркивание
_myLabel:
или лабораторию...
labSomething:
можно, вероятно, распознаться, хотя из других ответов, что Вам будет трудно найти стандарт кодирования, в котором говорится, что-либо кроме 'Не использует маркировки. Ответ затем, который я предполагаю, - то, что необходимо использовать любой стиль, имеет смысл Вам, пока это последовательно.
Практика convetion/best не должна была бы все еще использовать их вообще и осуществлять рефакторинг код так, чтобы было больше читаемого извлечения использования как метод.
Они - вид goto Java - не уверенный, если C# имеет их. Я никогда не использовал их на практике, я не могу думать о случае, где предотвращение их не привело бы к намного большему количеству читаемого кода.
, Но если Вы имеете к - я думаю, что все заглавные буквы в порядке. Большинство людей не будет использовать маркированные повреждения, поэтому когда они будут видеть код, ограничения выскочат в них и вынудят их понять то, что продолжается.
я знаю, я не должен использовать маркировки.
, Но просто принимают, у меня есть некоторый код, который мог получить много в удобочитаемости от маркированных повреждений, как я форматирую их.
мес, Ваша предпосылка является неправильной. Вопрос не должен быть, 'как я форматирую их?'
Ваш вопрос должен быть, 'У меня есть код, который имеет большую сумму логики в циклах - как я делаю это более читаемым?'
ответ на тот вопрос должен переместить код в человека, хорошо названные функции. Затем Вы не должны маркировать повреждения вообще.