Доступ к переменной класса-компаньона из другого класса

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

В следующем примере я могу получить доступ к 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 из другого класса в другом пакете, я получаю сообщение об ошибке "not found: value 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)   
}
}

1 ответ

Решение

Вы можете просто напечатать

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

Другие вопросы по тегам