2015-07-09 4 views
1

Я действительно новичок в scala. Я пытаюсь получить доступ к переменной класса companion вне класса. Как это сделать, если это возможно, без создания экземпляра класса.Доступ к переменной класса Companion из другого класса

В следующем примере, я могу получить доступ к INTERNAL_COST_REQUESTS внутри YotascaleCostProcessing класса

package com.yotascale 
class YotascaleCostProcessing extends YotascaleActorSystem{ 

//companion object 
object YotascaleCostProcessing{ 
val INTERNAL_COST_REQUESTS = "internal-cost-requests" 
val INTERNAL_COST_UPDATES = "internal-cost-updates" 
} 

def setupInfrastructure() = { 
    QueueService.createQueue(YotascaleCostProcessing.INTERNAL_COST_REQUESTS) 
    QueueService.createQueue(YotascaleCostProcessing.INTERNAL_COST_UPDATES) 
    } 
} 

Когда я YotascaleCostProcessing.INTERNAL_COST_UPDATES из другого класса в другой пакет, я получаю сообщение об ошибке «Не удалось найти значение YotascaleCostProcessing» даже хотя импорт для YotascaleCostProcessing существует. Единственный способ это работает, когда я делаю это:. Новый YotascaleCostProcessing() YotascaleCostProcessing.INTERNAL_COST_UPDATES

package com.yotascale.service.cost.setup; 
import com.yotascale.YotascaleCostProcessing 
class MetadataNotificationConfiguringActor(message:Message) extends UntypedActor { 

def configureBucket() = { 
val realtimeupdates = QueueService.getQueueURL(YotascaleCostProcessing.INTERNAL_COST_REQUESTS) 
} 
} 
+0

метод помечен как 'private', так что вы не можете сделать это , Вы также не можете вызывать частный, статический метод из другого класса в Java/C#. –

+0

Ой, позвольте мне изменить это. Это не то, что я намеревался. Ошибка копирования патча;). Переменная, которую я хочу получить, не является частной. –

+1

переместить объект из класса –

ответ

3

Вы можете просто ввести

Foo.counter 

как

import test.Foo 
object Test extends App { 
    println(Foo.counter) 
} 

и

package test 
object Foo { 
    var counter = 0 
} 

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

class YotascaleCostProcessing extends YotascaleActorSystem{ 
    class YotascaleCostProcessing$ { 
    val INTERNAL_COST_REQUESTS = "internal-cost-requests" 
    val INTERNAL_COST_UPDATES = "internal-cost-updates" 
    } 
    val YotascaleCostProcessing = new YotascaleCostProcessing$() 
} 

и вы не можете получить доступ к нему без экземпляра YotascaleCostProcessing

+0

При доступе к другому классу в другом пакете, я получаю сообщение об ошибке «not found: value Foo», хотя импорт для Foo существует. Единственный способ, которым это работает, - это когда я это делаю: new Foo(). Foo.counter –

+0

Можете ли вы предоставить минимальный пример? Этот вызов работает для меня, у вас может быть другая проблема –

+0

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