2013-05-03 2 views
0
public class A 
{ 
    public void doSomething() 
    { /*code*/} 
} 

Метод doSomething никоим образом не ссылающегося состояние объекта A так по этой логике он может быть static.Статическая против нового объекта

В чем разница между вариантом 1 и 2:

  1. new A().doSomething()
  2. Предполагая doSomething статична; A.doSomething()

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

+5

'new A()' создает новый объект; вызов статического метода не требует вызова экземпляра. Как правило, создание объекта * очень дешево * и я рекомендую * интерфейсы * и * избегать статических методов *. Причины, почему это не обязательно станет очевидным - и в это время вы можете просто поблагодарить такие предложения - до использования DI и/или IoC. – user2246674

+1

Возможно, он даже не должен быть в классе 'A'. –

+0

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

ответ

1

Вариант 1 создает новый экземпляр A для вызова метода doSomething(), который в соответствии с вашим вопросом, что кажется, что это не нужно (там нет ничего, что требует doSomething() экземпляра A). Вариант 2 пропускает ненужное создание экземпляра при одновременном создании такого же эффекта, поэтому было бы лучше (при условии, что это единственное требование к дизайну). Теперь могут быть и другие причины не использовать статические, например, если A реализован в интерфейсе, или если природа doSomething может измениться в какой-то момент в будущем, где может потребоваться информация, установленная за ее пределами.

-1

Вы должны были бы объявить метод как статический:

public class A { 
    public static void doSomething() { 
     // code 
    } 
} 

Это позволяет сделать A.doSomething(), а также предотвращает doSomething() смотреть на любые методы экземпляра или поля (потому что, как вы знаете, какой A экземпляр для использовать?), что не должно быть проблемой, если оно не ссылается на них в любом случае.

Для получения более подробной информации см. The Java Tutorial's Article on Instance and Class Methods.

+0

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

+1

@Sababado Oh. В этом случае я бы рекомендовал использовать статический метод, поскольку нет причин создавать объект, если он просто собирается получить GCed немедленно. Другие ответы для получения более подробной информации –

+0

Спасибо, большое спасибо – Sababado

0

Существует третий вариант.

Создайте один экземпляр A, затем повторно используйте его для каждого вызова.

например, в классе или приложения, использующего A,

A myA = new A(); // you can consider making this static if that makes sense... 

... затем, по мере необходимости в дальнейшем ...

myA.soSomething(); 

Преимущество заключается в том, что в будущее, если вам нужно изменить поведение doSomething, вы можете изменить первую строку на

A myA = new SubclassOfAThatDoesSomethingDifferent(); 

Или, если doSomething() в конечном итоге необходимо указать состояние A, он может.

+0

Хотелось бы это был вариант. Причина, по которой я решил это, состоит в том, что существует несколько разных файлов/классов, которые ссылаются на один и тот же метод. – Sababado

1

Вы входите в «выражение» части программирования. Что вы хотите выразить?

Три случая находятся в стадии обсуждения:

  1. вашего метод действие любого А можно взять, или сообщение любого данных А может ответить на,
  2. вашего метода действие от класса должен отвечать to, и
  3. A - однотонный, и ваш метод получает сообщения для этого одноэлементного.

Теперь спросите себя: что вы намерены выразить? Является ли «doSomething» подходящим для класса A? Или это, скорее, просто то, что должен делать каждый экземпляр А, независимо от его внутренних органов? Означает ли «А» то, что в мире вашей программы должно иметь только один экземпляр?

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

Многие базовые утилиты попадают в «статическую» категорию, и существует (небольшое) ограничение времени для создания нового экземпляра A, но в целом - вы, скорее всего, добьетесь этого, и, что более важно, , более поздняя жизнь этого метода будет иметь наименьшее влияние на другой код, если вы сможете правильно ответить на поставленные вопросы и, таким образом, выбрать реализацию, которая наиболее точно соответствует цели объекта.

Смежные вопросы