2015-06-01 2 views
0

Представьте себе следующую Java Class:Scala область применения, инициализация

class Test 
{ 
    private Button b; 
    private Table t; 

    public Test() 
    { 
     setupButton(); 
     setupTable(); 
    } 

    private void setupButton() 
    {    
     b = ... 
     b.doAwesomeStuff(); 
     // ... more stuff going on 
    } 

    private void setupTable() 
    {    
     t = ... 
     t.attach(b); // Works, because b is in (class) scope 
    } 
} 

Тот же самый код в Scala:

class Test() 
{ 
    setupButton(); 
    setupTable(); 

    private def setupButton(): Unit = 
    { 
     val button: Button = ... 
    } 

    private def setupTable(): Unit = 
    { 
     val table: Table = ... 
     table.attach(button) // <--- error, because button is not in scope, obviously 
    } 
} 

Теперь, конечно, есть решения этого.

One Being "Использование вары":

class Test 
{ 
    private var b: Button = _ 
    private var t: Table = _ 

    // ... Rest works now, because b and t are in scope, but they are vars, which is not necessary 
} 

Еще один является "положить все в одном методе", поэтому в основном сливаются setupButton() и setupTable(). Это ного, если материал, который происходит в этих методах, немного сложнее.

Еще один должен был бы дать методов такие параметры, как:

private void setupTable(b: Button) {...} 

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

Я уверен, что могу предложить несколько других решений, но я спрашиваю вас: что бы вы сделали в таком случае?

ответ

3

Refactor setupXXX метод и вернуть созданный компонент:

val button = setupButton() 
val table = setupTable() 

или без вспомогательных методов:

val button = { // setup button 
} 
val table = { // setup table 
} 
+0

Это хорошо работает, если вы делаете только одну кнопку. Но если у меня есть метод под названием «setupTableS()» (см. Множественное число), тогда мне нужно будет сделать это для каждой таблицы? (Было бы одинаково без вспомогательных методов) – Sorona

+0

@Teolha, если вы не можете отделить настройку компонентов, вы можете использовать способ настройки, например: val (table1, table2) = setupTables() 'например. –

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