2016-05-31 4 views
1

я вижу следующий код для одного класса метода, написанной коллегой:единственный метод класса Подходы

class Foo(boo: Boo){ 
    def doSomething() {...} 
} 

где есть инициализация данных с данными конфигурации приложения. Мне интересно, каковы его преимущества в отношении следующего подхода.

object Foo { 
    def doSomething(boo: Boo){...} 
} 

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

ответ

2

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

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

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

+0

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

+0

Я думаю, что это в значительной степени похмелье от того, как развивается разработка Java. С Spring/Guice было бы просто получить структуру для управления конфигурацией и инъекцией Foo для вас, если вы использовали первый подход. – Caoilte

1

Это прежде всего вопрос вкуса. Я согласен с вами в том, что, вероятно, здесь лучше использовать object, также потому, что он избегает ненужного выделения класса Foo. С другой стороны, класс ценности также был бы «свободным от размещения», а за кулисами - нечто подобное объекту singleton:

trait Boo 

class Foo(val boo: Boo) extends AnyVal { 
    def doSomething() = ??? 
}