我已经看到它写在stackoverflow上的多个线程/注释中,使用switch的只是糟糕的OOP风格.就个人而言,我不同意这一点.
在许多情况下,您无法向enum要打开的类添加代码(即方法),因为您无法控制它们,可能它们位于第三方jar文件中.还有其他一些情况,将功能放在枚举本身是一个坏主意,因为它违反了一些关注点分离的考虑因素,或者它实际上是其他东西以及枚举的函数.
最后,交换机简洁明了:
boolean investable;
switch (customer.getCategory()) {
case SUB_PRIME:
case MID_PRIME:
investible = customer.getSavingsAccount().getBalance() > 1e6; break;
case PRIME:
investible = customer.isCeo(); break;
}
Run Code Online (Sandbox Code Playgroud)
我不是在捍卫每一个用途,switch我不是说它总是要走的路.但在我看来,像"Switch是代码味道"这样的陈述是错误的.还有其他人同意吗?
我搬到我使用的IDEA插件的最新版本后遇到了问题.我可以从他们的网站下载以前版本的插件的ZIP文件,但我找不到有关如何手动安装特定版本插件的任何安装说明.
有人知道怎么做吗?
什么是优秀的Java Swing日期选择器组件?到目前为止,我只是真的发现了这两个:
与我在网页上看到的一些相比,这些看起来有点笨拙.例如,同时看到多个月可能会很好.有谁知道那里有任何其他好的小部件?
我一直想知道透明 implicit转换是否真的是一个好主意,是否真的可以更好地使用implicits更多,嗯,明确.例如,假设我有一个接受a Date作为参数的方法,并且我有一个隐式转换,它将a String转换为Date:
implicit def str2date(s: String) : Date = new SimpleDateFormat("yyyyMMdd").parse(s)
private def foo(d: Date)
Run Code Online (Sandbox Code Playgroud)
那显然我可以通过透明implicit转换来调用它:
foo("20090910")
Run Code Online (Sandbox Code Playgroud)
将字符串转换为更明确的日期这一事实会更好吗?
class DateString(val s: String) {
def toDate : Date = new SimpleDateFormat("yyyyMMdd").parse(s)
}
implicit def str2datestr(s: String) : DateString = new DateString(s)
Run Code Online (Sandbox Code Playgroud)
那么用法看起来更像是:
foo("20090910".toDate)
Run Code Online (Sandbox Code Playgroud)
这样做的好处是稍后会发生什么事情更清楚 - 我现在已经被implicit我应该知道的透明转换(Option对Iterable任何人?)已经被抓了几次,这种用法仍然允许我们利用implicit秒.
有Java API中的可膨胀的数组类相当于Vector或ArrayList可以与图元可以使用类(INT,炭,双,等)?
我需要整数快速,可扩展的阵列,它似乎浪费有包裹他们在Integer班级,以便与使用它们Vector或ArrayList.我的google-fu让我失望了.
这个问题说明了一切,真的.我知道(Scala)Monad看起来像这样:
trait Monad[M[_]] {
def pure[A](a : A) : M[A]
def bind[A, B](ma : M[A], f : A => M[B]) : M[B]
}
Run Code Online (Sandbox Code Playgroud)
Monad Transformer是什么样的?它们用于什么?
比方说,我只是想用replicateM从Scalaz ;
scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
scala> some(4).replicateM[List](2)
res20: Option[List[Int]] = Some(List(4, 4))
Run Code Online (Sandbox Code Playgroud)
现在让我们说,而不是有一个Option[Int],我需要读取一个Int值File:
scala> val f = (_ : java.io.File) => some(1)
f: (java.io.File) => Option[Int] = <function1>
Run Code Online (Sandbox Code Playgroud)
所以,我可以对待这个读者,好像它是一个Monad?
scala> ReaderT(f).replicateM[List](2)
<console>:16: …Run Code Online (Sandbox Code Playgroud) 在即将发布的scala 2.8中,util.control添加了一个包,其中包含一个break库和一个用于处理异常的构造,以便代码看起来像:
type NFE = NumberFormatException
val arg = "1"
val maybeInt = try { Some(arg.toInt) } catch { case e: NFE => None }
Run Code Online (Sandbox Code Playgroud)
可以用以下代码替换:
import util.control.Exception._
val maybeInt = catching(classOf[NFE]) opt arg.toInt
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么?除了提供另一种(完全不同的)表达同一事物的方式之外,这又增加了什么呢?是否可以使用新控件表达但不能通过try-catch?它是一个DSL应该在Scala中使异常处理看起来像其他语言(如果是这样,哪一个)?
我正在尝试编写一个方法,它接受任何类型的集合CC[_]并将其映射到一个新的集合(相同的集合类型,但不同的元素类型),我正在挣扎皇家.基本上我正在尝试实现map但不是集合本身.
我正在尝试使用签名实现一个看起来有点像的方法:
def map[CC[_], T, U](cct: CC[T], f: T => U): CC[U]
Run Code Online (Sandbox Code Playgroud)
它的用法是:
map(List(1, 2, 3, 4), (_ : Int).toString) //would return List[String]
Run Code Online (Sandbox Code Playgroud)
我感兴趣的答案也将在哪里工作CC是Array我很感兴趣,我尝试(下)都最终没有奏效的原因.
(对于不耐烦的人,在接下来的内容中,我完全没有让它发挥作用.重申一下,问题是"我怎么能写出这样的方法?")
我这样开头:
scala> def map[T, U, CC[_]](cct: CC[T], f: T => U)(implicit cbf: CanBuildFrom[CC[T], U, CC[U]]): CC[U] =
| cct map f
^
<console>:9: error: value map is not a member of type parameter CC[T]
cct map f
^
Run Code Online (Sandbox Code Playgroud)
好的,这是有道理的 - 我需要说这 …
前一段时间我读了(在我丢失它之前)一本名为GUI Bloopers的好书,其中充满了不良GUI设计的例子,但也充满了有用的花絮,比如不要把事情称为 Dialog 一分钟和 Popup 下一分钟.
您将为设计/记录GUI提供哪些重要提示?听说您设计的小部件将可读信息塞入尽可能小的屏幕空间中会特别有用.
我将用我自己的一个来推动它:避免树木(例如Swing JTree),除非你真的无法避免它,或者有一个无限的层次结构.我发现用户没有发现它们直观,而且很难导航和过滤.
PS.我认为这个问题不同于这一个为我所要求的多面手提示