小编oxb*_*kes的帖子

人们是否提供了多种机制来在API中执行相同的操作?

设计具有多种实现相同结果的API的API是否令人困惑?例如,我有我自己的Date库(这是Java围绕一个简单的包装Date/ Calendar班来区分年月日,Date中,从即时的时间,Instant并提供机制,在两者之间转换).我从一个方法开始创建一个实例Date:

Date.valueOfYearMonthDay(int year, int month, int day);
Run Code Online (Sandbox Code Playgroud)

但后来我发现使用API​​的结果代码不是很易读.所以我补充说:

Date.yearMonthDay(int year, int month, int day)
Date.ymd(int year, int month, int day)
Date.date(int year, int month, int day)
Run Code Online (Sandbox Code Playgroud)

然后我开始流利了:

Date.january().the(int day).in(int year);
Run Code Online (Sandbox Code Playgroud)

(我发现流畅的版本对于进行可读测试非常有用).所有这些方法都做相同的事情,并具有准确的JavaDoc.我想我已经读过,perl每个程序员都可以选择他/她更喜欢解决某些问题的方法.而且一个优点Java是通常只有一种做事方式:-)

人们的意见是什么?

java api

4
推荐指数
2
解决办法
271
查看次数

在实践中用Scala演员编写应用程序II

因为我的第一个问题太长了,我要问这是一个单独的问题.这是关于基于actor的应用程序的体系结构的另一个问题.

通过应用程序跟踪消息路径

我们来看一段Java代码:

public void deleteTrades(User user, Date date) {
    PermissionSet ps = permissionService.findPermissions(user)
    if (ps.hasPermission("delete")) {
        Set<Trade> ts = peristence.findTrades(date);
        reportService.sendCancelReports(ts);
        positionService.updateWithDeletedTrades(ts);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我有4个独立的组件,并且程序所需的它们之间的交互deleteTrades是明确定义的.它完全包含在方法中deleteTrades.

使用Actors对其进行建模并用4个独立的actor替换我的4个组件,如何跟踪(在我看来)过程涉及的内容?特别是如果我避免使用!?运算符,那么我很可能会ConditionalDelete向我PermissionActor发送一条消息,它将GetTradesAndDelete向我发送消息,PersistenceActor然后发送更多消息等等.处理删除的代码将被散布跨我的应用程序.

这也意味着几乎每个actor都需要处理其他每个actor(为了转发消息).

正如我之前的问题,人们如何处理这个问题?有没有一个很好的建模工具,可以让你跟踪所有这些?人们使用!?我是否将太多组件转换为Actors?

scala actor

4
推荐指数
1
解决办法
1770
查看次数

具有固定/可变arity(varargs)匹配的最具体方法

Java语言规范的第15.12.2.5节中,它讨论了如何在具有固定arity的方法和可变arity方法(即varargs)中选择最具体的方法.

我在JLS中找不到的是关于两个方法之间的决定,其中一个是固定的arity,另一个是变量arity.例如:

public interface SomeApi {
    public String getSomething(String arg);       // method 1
    public String getSomething(String ... args);  // method 2
}
Run Code Online (Sandbox Code Playgroud)

按照人们的预期编译就好(由Yoni概述的原因如下).这个调用代码也编译:

SomeApi api = ...
Object o = api.getSomething("Hello");
Run Code Online (Sandbox Code Playgroud)

如果你运行它,method #1(即非varargs方法)被调用.为什么这个调用代码没有含糊不清?为什么固定arity方法比变量arity方法更具体?有人能指出我对规范的相关部分吗?

java variadic-functions jls

4
推荐指数
1
解决办法
1120
查看次数

是否有按元素类型过滤和映射集合的内置更优雅的方法?

如果我想缩小,例如,Iterable[A]对于特定类型的所有元素(例如String)我可以做:

as filter { _.isInstanceOf[String] }
Run Code Online (Sandbox Code Playgroud)

但是,显然需要使用它作为Iterable[String]可以通过以下方式完成map:

as filter { _.isInstanceOf[String] } map { _.asInstanceOf[String] }
Run Code Online (Sandbox Code Playgroud)

这很难看.当然我可以用flatMap:

as flatMap[String] { a => 
  if (a.isInstanceOf[String]) 
    Some(a.asInstanceOf[String]) 
  else
    None
}
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否更具可读性!我写了一个函数,narrow可以通过implicit转换使用:

as.narrow(classOf[String])
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一个我忽略的更好的内置机制.特别是因为能够将a缩小List[A]到a List[String]而不是Iterable[String]与我的函数一样,这将是很好的.

types scala scala-collections

4
推荐指数
1
解决办法
607
查看次数

对Java枚举使用类型别名

我想实现类似的Scala是如何定义的东西Map作为两个预定义typeobject.在Predef:

type Map[A, +B] = collection.immutable.Map[A, B]
val Map = collection.immutable.Map //object Map
Run Code Online (Sandbox Code Playgroud)

但是,我想使用Java enum(来自共享库)来实现这一点.例如,我有一些全局别名:

type Country = my.bespoke.enum.Country
val Country = my.bespok.enum.Country //compile error: "object Country is not a value"
Run Code Online (Sandbox Code Playgroud)

这样做的原因是我希望能够使用如下代码:

if (city.getCountry == Country.UNITED_KINGDOM) //or...
if (city.getCountry == UNITED_KINGDOM)
Run Code Online (Sandbox Code Playgroud)

但是,在同时导入我的类型别名时这是不可能的.注意:如果我没有声明预定义类型并导入它,此代码将正常工作!我可以使用一些语法来实现这个目的吗?

enums scala

4
推荐指数
1
解决办法
3264
查看次数

Java代码中的"?extends"上的Scala类型推断失败

我有以下简单的Java代码:

package testj;
import java.util.*;

public class Query<T> {

    private static List<Object> l = Arrays.<Object>asList(1, "Hello", 3.0);

    private final Class<? extends T> clazz;

    public static Query<Object> newQuery() { return new Query<Object>(Object.class); }

    public Query(Class<? extends T> clazz) { this.clazz = clazz; }

    public <S extends T> Query<S> refine(Class<? extends S> clazz) {
        return new Query<S>(clazz);
    }

    public List<T> run() {
        List<T> r = new LinkedList<T>();
        for (Object o : l) {
            if (clazz.isInstance(o)) r.add(clazz.cast(o));
        }
        return r;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以用Java调用它,如下所示: …

generics scala type-inference scala-2.7

4
推荐指数
1
解决办法
1028
查看次数

在查看隐式转换时,为什么类型推断仅选择最具体类型的目标引用?

请考虑以下简单代码来创建typesafe等号.第一部分允许我Identity为任何类型创建一个类型类.

scala> trait Equals[A] { def equal(a1 : A, a2 : A) : Boolean }
defined trait Equals

scala>  sealed trait Identity[A] {
     | def value : A
     | def ===(b : A)(implicit e : Equals[A]) = e.equal(value, b)
     | }
defined trait Identity

scala> implicit def ToIdentity[A](a : A) = new Identity[A] { val value = a }
ToIdentity: [A](a: A)java.lang.Object with Identity[A]
Run Code Online (Sandbox Code Playgroud)

所以,如果我创建一个类型类Equals[Int],我现在应该可以使用我的typesafe equals:

scala> implicit val EqualsInt = new Equals[Int] { def equal(i1 …
Run Code Online (Sandbox Code Playgroud)

scala type-inference typeclass

4
推荐指数
1
解决办法
368
查看次数

Scala弹出菜单

如何在Scala中显示弹出窗口?我有一个"后门"但对我来说似乎很难看:

val item = new MenuItem(new Action("Say Hello") {
  def apply = println("Hello World");
})
//SO FAR SO GOOD, NOW FOR THE UGLY BIT!
val popup = new javax.swing.JPopupMenu
popup.add(item.peer)
popup.setVisible(true)
Run Code Online (Sandbox Code Playgroud)

swing scala popup

3
推荐指数
1
解决办法
2258
查看次数

3
推荐指数
1
解决办法
1940
查看次数

Scala BigDecimal分部

scala上的除法运算符有什么用BigDecimal

val d1 = BigDecimal(2)
val d2 = BigDecimal(3)
val div = d1 / d2 //throws ArithmeticException: non-terminating decimal expansion
Run Code Online (Sandbox Code Playgroud)

为了使其工作,您需要DECIMAL128在小数上定义上下文.不幸的是,我能看到这样做的唯一方法是:

val div = new BigDecimal(d1.bigDecimal.divide(d2.bigDecimal, MathContext.DECIMAL128)) //OK!
Run Code Online (Sandbox Code Playgroud)

但这只是一团糟!我错过了什么吗?

scala bigdecimal

3
推荐指数
1
解决办法
2065
查看次数