Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否应该更改为scala以创建具有重写规则的系统?_Java_Android_Scala_Architecture - Fatal编程技术网

Java 我是否应该更改为scala以创建具有重写规则的系统?

Java 我是否应该更改为scala以创建具有重写规则的系统?,java,android,scala,architecture,Java,Android,Scala,Architecture,我开发了一些类,这些类在Android应用程序中使用。我在这个核心中有6-7个类,其中一些是带有抽象方法的抽象类。创建这些类是为了提供一个API来扩展我的Android应用程序 现在我想创建一个接受重写规则的可扩展系统。这些规则对于在运行时替换某些组件非常有用。想象一个有数学运算的系统,你可以看到所有的和,乘法,等等。现在你可以缩小,我想根据缩放级别简化一些运算 我的系统是用java构建的,但我相信scala和模式匹配可以简化我的问题。然而,每次我看scala的时候,我都会发现我要花很多时间和精

我开发了一些类,这些类在Android应用程序中使用。我在这个核心中有6-7个类,其中一些是带有抽象方法的抽象类。创建这些类是为了提供一个API来扩展我的Android应用程序

现在我想创建一个接受重写规则的可扩展系统。这些规则对于在运行时替换某些组件非常有用。想象一个有数学运算的系统,你可以看到所有的和,乘法,等等。现在你可以缩小,我想根据缩放级别简化一些运算

我的系统是用java构建的,但我相信scala和模式匹配可以简化我的问题。然而,每次我看scala的时候,我都会发现我要花很多时间和精力

我的类用于创建如下结构:

我希望能够编写规则来创建包含其他块的块。比如:

Integer Provider + Integer Provider -> Sum Provider
Sum Provider + Sum -> Sum Provider
规则可以由程序员创建。我的结构中的任何元素也可以由程序员构建。我不知道scala是否简化了这个规则引擎系统,但我知道用java构建这个引擎可能会很无聊(可能会产生很多bug,我会忘记一些情况,等等)

我是否应该将所有系统都更改为scala?还是只有scala的这个特性可以使用?值得吗


PS:有关结构的更多信息,请参阅本帖

如果要切换到Scala,请尽可能切换到它。使用Java几乎没有意义

值得投资吗?从网络上的阅读(以及我自己的印象)来看,使用Scala不会更快,但会学到很多东西

因此,如果您只关心开发速度:忽略Scala


如果你想学习:Scala是下一个学习和使用的语言的绝佳选择。

如果你要切换到Scala,请尽一切可能切换到它。使用Java几乎没有意义

值得投资吗?从网络上的阅读(以及我自己的印象)来看,使用Scala不会更快,但会学到很多东西

因此,如果您只关心开发速度:忽略Scala


如果你想学习:Scala是下一个学习和使用的语言的绝佳选择。

作为一个单独的开发人员,Scala具有丰富的表达能力和强大的功能,因此一旦掌握了它,你就可以满足于少写多做——少编写样板代码,多使用简洁的习惯用法

然而,Scala的强大是要付出代价的:它是一种完全不同的语言,与Java有着不同(我要说更复杂)的习惯用法和语法。Java被设计为故意简单,其思想是,在开发人员之间共享更多代码的大型组织中,明确性和语法简单性比精练的代码更有价值

Java有意选择提供一个更小的工具集,以使一个开发人员能够尽可能快速、轻松地找到另一个开发人员的工作,因此从这个意义上讲,它是面向团队开发的。然而,Scala为您提供了更多的约束,使您可以创建简洁但不那么明显的结构,这对于大型企业环境来说可能是一个缺点

目前,Scala的开发人员库也比Java小,这意味着如果您打算雇佣开发团队,示例和人才库会更少


但是,作为一个单独项目的单独开发人员或是一个小而紧密的团队,一旦你克服了重大的学习困难,Scala就可以很有趣、很快地编写代码。

作为一个单独的开发人员,Scala表现力强、功能强大,因此一旦掌握了它,就可以满足于少写多做——少编写样板代码,多使用简洁的习惯用法

然而,Scala的强大是要付出代价的:它是一种完全不同的语言,与Java有着不同(我要说更复杂)的习惯用法和语法。Java被设计为故意简单,其思想是,在开发人员之间共享更多代码的大型组织中,明确性和语法简单性比精练的代码更有价值

Java有意选择提供一个更小的工具集,以使一个开发人员能够尽可能快速、轻松地找到另一个开发人员的工作,因此从这个意义上讲,它是面向团队开发的。然而,Scala为您提供了更多的约束,使您可以创建简洁但不那么明显的结构,这对于大型企业环境来说可能是一个缺点

目前,Scala的开发人员库也比Java小,这意味着如果您打算雇佣开发团队,示例和人才库会更少


但是,作为一个单独项目的单独开发人员或是一个小而紧密的团队,一旦你克服了学习上的困难,Scala就可以很有趣、很快地编写代码。

是的,在Scala中编写这样的规则很容易,事实上,在Scala中的规则重写系统的堆栈溢出方面存在一些问题。另外,有一些库可能会在这方面帮助您,与战略编程和nlp相关,但我还没有使用它们,所以我不能发表太多评论

现在,我不知道这些课程是从哪里来的。如果您正在解析和构建它们,parser combinator库可以轻松地处理它:

sealed trait Expr { def value: Int }
case class Number(value: Int) extends Expr
case class Sum(e1: Expr, e2: Expr) extends Expr { def value = e1.value + e2.value }

object Example extends scala.util.parsing.combinator.RegexParsers {
  def number: Parser[Expr] = """\d+""" ^^ (n => Number(n.toInt))
  def sum: Parser[Expr] = number ~ "+" ~ expr ^^ {
    case n ~ "+" ~ exp => Sum(n, exp)
  }
  def expr: Parser[Expr] = sum | number
}
如果您以其他方式拥有这些类,并且正在应用简化,您可以这样做:

def simplify(expr: List[Expr]): Expr = expr match {
  case expr :: Nil => 
    List(expr) // no further simplification
  case (n1: NumberProvider) :: Plus :: (n2: NumberProvider) :: rest => 
    simplify(SumProvider(n1, n2) :: rest)
  case (n: NumberProvider) :: Plus :: (s: SumProvider) :: rest => 
    simplify(SumProvider(n, s) :: rest)
  case (s: SumProvider) :: Plus :: (n: NumberProvider) :: rest => 
    simplify(SumProvider(s, n) :: rest)
  case other => other // no further simplification possible
}

这里的重要元素是案例类、提取器和模式匹配。

是的,在Scala中编写这样的规则很容易,事实上,Scala中的规则重写系统在堆栈溢出方面存在一些问题。另外,有一些库可能会在这方面帮助您,与战略编程和nlp相关,但我还没有使用它们,所以我不能发表太多评论

现在,我不知道这些课程是从哪里来的。如果你是