2016-10-03 9 views
-1

Есть ли разница в классе и локальном экземпляре, когда первый не является обязательным (обычно, когда я могу их завершить)? Должен ли я следовать «правилу»?Класс против локального экземпляра

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

public class aService { 
    private final SomeClass someClass = new SomeClass(); 

    public void someMethod() { 
     someClass.doSomething(); 
    } 
} 

// or 

public class aService { 
    public void someMethod() { 
     SomeClass someClass = new SomeClass(); 
     someThing.doSomething(); 
    } 
} 
+0

это зависит от того, что делает и делает someClass. Есть ли на нем какое-либо состояние или оно неизменное? –

+0

Это не совсем то же самое, но когда это не имеет значения, тогда первая версия лучше, потому что вам нужно создать объект только один раз для одного объекта, а не один раз для вызова метода. – maraca

+5

* Значительная * разница между этими двумя заключается в том, что в первом примере у вас будет доступ к переменной, называемой 'someClass' во всех областях, тогда как во втором примере' someClass' исчезает, как только 'someMethod' заканчивается выполнения. В таком случае вы задаете свой вопрос о жизненном цикле этой переменной? – Makoto

ответ

0

Я предпочел бы инициализировать someClass в данном методе, если он используется только в этом методе.

Если вы хотите использовать someClass во всех методах (более одного) и состояния хранения объектов, а затем выбрать решение 1.

Первый подход лучше, если вы хотите оптимизировать, потому что someClass создается только один раз. С другой стороны, вы никогда не позвоните по номеру someMethod(). В этом случае вы теряете память. Особенно, если у вас много таких объектов.

0

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

Вместо этого, я бы предпочел сосредоточиться на том, чтобы сделать метод, о котором я забочусь, в SomeClassstatic. Основная причина заключается в том, что я могу сохранить ненужное создание объекта и сделать API и его использование более плавным лот.

+0

Это интересный способ. Статический, возможно, это то, что я искал. – pror21

+0

И, возможно, намного сложнее провести единичный тест. Я думаю, что статичность должна использоваться только тогда, когда есть очень веские причины для этого. – GhostCat

+0

@GhostCat, что бы вы сделали? – pror21

0

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

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