Scala“构造函数秒表无法在Main类中访问”

时间:2016-01-25 01:57:21

标签: scala constructor guava slf4j

关于解决方案的摘要,我以为我正在处理Scala问题,但事实证明Stopwatch和Scala Logging有私有构造函数,而我没有调用正确的公共方法来实例化它们。 gzm0下面的回答指出了这一点。

尝试使用Guava Stopwatch和Scala Logging,无论我是在Main还是在实例化的类中创建new Stopwatch()new Logger(),我都会在gradle run中收到此错误:

constructor Logger in class Logger cannot be accessed in class RedBlackTree4150
var loggerInst = new Logger()
constructor Stopwatch in class Stopwatch cannot be accessed in class RedBlackTree4150
var stopWatchInst = new Stopwatch()

如果这是thisthis问题的副本,我不太了解它。我看了this question但它没有接受的答案,我试着(只是为了好玩)把我的parens从我的构造函数调用中解脱出来。

编写我的第一个Gradle / Scala项目以进行算法分析。我想如果我使用Java,我会问静态与非静态,不确定是否属于我正在处理的问题。 Scala不是作业的一部分,因此我没有使用作业标签。

以下是我如何调用它们以及我的程序的第一部分the full .scala file and the build.gradle are on Github

import com.google.common.base.Stopwatch
import com.typesafe.scalalogging.slf4j.Logger
import scala.collection.immutable.TreeMap
import java.util.concurrent.TimeUnit

object Main extends App {
  // var rbtree = new RedBlackTree4150(logger, stopWatch)
  var rbtree = new RedBlackTree4150()
}
// class RedBlackTree4150 (var loggerInst: Logger, var stopWatchInst: Stopwatch) {
class RedBlackTree4150() {
  var loggerInst = new Logger()
  var stopWatchInst = new Stopwatch()

正如你所看到的,我已经尝试通过将它全部变为一个Object来简化它,并通过在Main中实例化Logger和Stopwatch并将它们传递给类(我知道的坏主意),但这些都不起作用。我错过了什么简单的Scala事情?感谢。

否则我相信我已经在项目中正确拥有了所有依赖项,并且在命令行中得到了相同的错误。

我还有一个错误I posted as a separate question here,以防万一它是相关的,错误是:

/home/jim/workspace/Scala/RedBlackTree4150/src/main/scala/Main.scala:36: value map is not a member of Double
  timingsMap = for (i <- powersList; j <- runTest(i)) yield i -> j

1 个答案:

答案 0 :(得分:5)

StopwatchLogger的构造函数都是私有的。您需要使用工厂方法来实例化它们。

如果是Stopwatch,您可以使用createUnstarted()方法:

val stopwatch = Stopwatch.createUnstarted()

如果是Logger,您必须使用apply方法。但是,它需要底层的SLF4J记录器。您可以通过SLF4J的LoggerFactory

创建一个
import org.slf4j.LoggerFactory
val logger = Logger(LoggerFactory.getLogger(getClass))