Jul 10, 2017 10:38:44 AM

作者:

类型强好,还是类型弱好?

强类型好,尤其是对编译器友好。而且 IDE 支持的比较好。 弱类型好,因为程序员写程序的时候,不需要考虑类型,只需要考虑逻辑。

其实,即使是 Javascript,这样的弱类型语言,也不能很好的将类型互相转换的很好。

我希望在我编程的时候,大多数时间都强类型。我感觉很安全,但是当我想模糊类型的时候,我能有一个工具,帮我把任何类型转成我希望的另外的类型。当然,我自己定义的对象,我并不介意写一个转换过程,但是请只让我写一次。

所以,这就是 Nutz.Castors

Hello Castors

举个很简单的例子:

你还可以:

    你甚至还能:

    它完全能支持容器:

    1. List<Pet> petList = ...;
    2. Pet[] pets = Castors.me().castTo(petList, Pet[].class);

    Castors 的原理

    请查看 Git@OSC镜像,这里面的一个个的实现类就是 Nutz 为你内置的类型转换器。

    每当你要转换一个对象,Nutz.castors 都会看看能不能直接转换,如果不能,它就在这个包里找找,看看有没有合适的转换器。Object2Object 转换器是最终极的转换。它尝试着在目标对象里寻找构造函数,或者静态工厂方法,如果找到一个方法有且只有一个参数是源对象。那么它就会高兴的构造目标对象,否则则抛出异常。

    类型转换配置

    比如日期和时间,你需要定制自己的日期类型,请参看默认的 CastorSetting 的源代码:

    1. public static void setup(DateTimeCastor<?, ?> c) {
    2. c.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
    3. }
    4. }

    它有一个函数,是设置 DataTimeCastor 的,那么 Nutz.Castor 会在构造这种类型的转换器前,调用一下这个函数。这个函数会初始化一下相应的 DataTimeCastor。

    替换这个默认实现。

    你可以通过:

    1. Castors.resetSetting();

    来把转换配置,恢复到默认值

    添加自己的 Castor

    你的项目可能会有很多自定义的 POJO,而如果你想支持它们之间流畅的转换,你可能需要写一组 A2B 以及 B2A 的转换器。这些转换器,你可以分别放在不同的包下,为了能让 Nutz.Castors 找到你的转换器,你需要在项目启动时:

    举个详细的例子,比如你有两组转换器:

    为了能让 Nutz.Castors 找到这两组转换器,你需要在项目启动时加载一下:

      这样, A2B 和 X2Y 这两包下所有的转换器,都会被加载,并且他们的优先级按加载顺序,后加载的比先加载的要高。Nutz 提供的默认的转换器,自然优先级最低。