Intellij修改archetype Plugin配置

2014-03-16 09:26 by 破狼, 204 阅读, 0 评论,收藏编辑

Maven archetype plugin为我们提供了方便的创建 project功能,Archtype指我们项目的骨架,作为项目的脚手架。 如fornt end的yo之类。我们能够通过简单的一行控制台command line创建你所需要的项目结构:

1
2
3
4
5
6
mvn archetype:generate
  -DarchetypeGroupId=<archetype-groupId>
  -DarchetypeArtifactId=<archetype-artifactId>
  -DarchetypeVersion=<archetype-version>
  -DgroupId=<my.groupid>
  -DartifactId=<my-artifactId>

常用的Maven archetype plugin有:

  • org.apache.maven.archetypes:maven-archetype-quickstart
  • org.apache.maven.archetypes:maven-archetype-site
  • org.apache.maven.archetypes:maven-archetype-webapp
  • 以及spring或者第三方提供了一些archetype plugin。

同时在java世界强大的IDE Intellij也支持按照maven archetype 创建java项目。你只需要选择maven 创建项目,在最后选择你希望的 archetype plugin,然后就可以喝杯coffe等待build success。

关于如何自定义项目的Maven archetype plugin,博主将会 在后续的文章介绍。在此次博文将是记录如果去掉你手动在intellij中添加 的archetype plugin。

mac版本,你可以找到文件:

~/Library/Caches/IntelliJIdea<version>/Maven/Indices/UserArchetypes.xml

然后用你喜欢的编辑器打开它(例如博主当前使用的Atom):

<?xml version="1.0" encoding="UTF-8"?>
<archetypes>
<archetype groupId="com.github.greengerong" artifactId="components-archetype" version="1.0.0" />
</archetypes>

你可以在xml的archetypes节点增加或者删除修改配置,然后重新启动你的Intellij。

本博客已经转移个人博客破狼,也有有部分更新,但不保证及时维护,如果你希望及时看到本人的新日志,那请订阅破狼-RSS
ThoughtWorks 正在火热招聘中,有兴趣者,请点击ThoughtWorks招聘

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/

C#函数式程序设计之泛型(上)

 

在面向对象语言中,我们可以编写一个元素为某个专用类型(可能需要为此创建一个ListElement)的List类,或者使用一个非常通用、允许添加任何类型元素的基类(在.NET中,首先想到的是System.Object)。这两种方法都有缺点。使用通用类型的基类时,很可能会把不相容的元素添加到列表中;如果使用元素为专用类型的列表,只是推迟此问题的发生,因为实际类型是在最后封装到这个类中。泛型提供了这个问题的解决方法。

一般而言,一个泛型类型G可以应用于一个或多个其他类型——如O1、O2等——其思想是,G的实现不需要对Ox等类型知道很多。

C#函数式程序设计之泛型函数

任何方法在为方法签名添加一个或多个类型参数后,就成为泛型。如下所示:

1
2
3
4
static void OutputThing<T>(T thing)
{
      Console.WriteLine("Thing: {0}",thing);
}   

这里T是类型变量,它出现在方法名后面的一对尖括号中。这样声明后,这个参数就可以在参数列表中和方法体重当成类型使用。这个方法并不关心这个thing元素和它的类型,它只是把它的值传递给其他方法以进一步处理。

下面是用显示类型参数调用这个函数:

1
2
OutputThing<string>("A string");
OutputThing<int>(42);

使用显式类型参数意味着这个类型要受到Visual Studio的智能感知和C#编译器的双重检查。如下面这个调用会产生编译错误信息:

1
OutputThing<double>("A string");

错误如下:

尽管这个例子很简单,但它说明泛型的一个作用:不是使用类型对象的参数,而是在调用中显式说明类型,这回启动严格的类型检查。

另一方面,许多程序员认为直接使用显式类型过于草率,OutputThing方法也可以像下面这样调用:

1
2
OutputThing("A string");
OutputThing(42);

这里使用类型推断机制可以根据字面值推断它的类型。这并不是一个无类型调用,在OutputThing方法中还有一个类型变量T。上面两个调用语句实际上T分别代表了string和int,编译器会在编译时自动为它们替换为该类型。

然而,许多程序员把C#类型推断看成是一个只有在必要时才使用的功能,而不是一个任何时候都可以使用的通用工具,这是正确的,使用类型推断,会让复杂的代码的可读性变差。

下面是一个稍微复杂(同时也比较有用)的有关泛型的李子

1
2
3
4
5
6
7
static void Apply<T>(IEnumerable<T> sequence, Action<T> action)
{
    foreach (T item in sequence)
    {
        action(item);
    }
}

本例中也有一个类型参数T,但是它作用在这个方法的两个参数上,它们之间存在一种关联:第一个参数是事件序列,第二个参数是一个委托,此委托作用的参数就是在此序列中的事件类型。这正是泛型表现出强大功能的地方,如果不使用泛型,但仍然希望此方法可以灵活应用于不同类型,就无法表现出这种关联性。

泛型元素并不关心类型本身。下面是对Apply方法的调用:

1
2
var values = new List<int> { 10, 20, 35 };
Apply(values, v => Console.WriteLine("Value:{0}", v));

调用Apply方法,但是省略了泛型参数,编译器需要推断Apply调用语句中参数T的类型,为此需要检查参数。

C#函数式程序设计之泛型类

也可以给类添加类型信息。在这种情况下,类型参数的作用域是整个类,但其用法与前面完全一样:它代表某个类型。下面的例子是一个链表的实现(不完整):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ListItem<T>
{
    public ListItem(T value)
    {
        this.value = value;
    }
 
    private ListItem(T value, ListItem<T> next)
        : this(value)
    {
        this.next = next;
    }
 
    private readonly T value;
    public T Value
    {
        get { return value; }
    }
 
    private ListItem<T> next;
    public ListItem<T> Prepend(T value)
    {
        return new ListItem<T>(value, this);
    }
}

ListItem类有一个泛型参数T,这个参数封装在ListItem容器中,在类中任何需要显式类型的位置都可以使用这个类。使用泛型会使ListItem类更加灵活,因为它可以把任何其他类型的信息封装到链表列中。

同时,泛型系统会使编译器的类型检查功能更强大。上例中的Prepend方法只接受T类型的值。从ListItem类的实例角度来看,T是固定的,换言之,新的值必须与当前实例的值具有相同类型。分析下面的例子:

1
2
3
4
5
6
public static void List()
{
    var intItem = new ListItem<int>(10);
    var secondItem = intItem.Prepend(20);
    var thirdItem = secondItem.Prepend("string");
}   

这里,当ListItem类与new关键字一起使用时,要在类名中添加一个类型参数,现在保存在ListItem变量中的实例是类型化的,包含了类型为int的值。其结果是,Prepend方法可以接受一个为int的类型参数,因此,上例会报错:

泛型语法的最后一个部分是多个类型参数。在任何情况下,只要使用类型参数,就不会只有一个。看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Test<T1, T2>
{
    private Test(T1 val1, T2 val2)
    {
        this.val1 = val1;
        this.val2 = val2;
    }
    private readonly T1 val1;
    public T1 Val1
    {
        get
        {
            return val1;
        }
    }
 
    private readonly T2 val2;
    public T2 Val2
    {
        get
        {
            return val2;
        }
    }
}

使用多个泛型参数实际上并没有什么特别之处。重要的是必须认识到这是完全可行的,最后一点是:类中的类型参数与方法中的类型参数可以同时使用,但是必须保证它们不会发生冲突。

 
 
分类: C#专题

C#函数式程序设计之泛型的更多相关文章

  1. C#函数式程序设计之泛型(下)

    C#函数式程序设计之泛型(下)   每当使用泛型类型时,可以通过where字句对泛型添加约束: + 这个例子直观地声明了一个约束:类型T必须与ListItem<string>相匹配.泛型类 ...

  2. C#函数式程序设计之泛型(上)

    在面向对象语言中,我们可以编写一个元素为某个专用类型(可能需要为此创建一个ListElement)的List类,或者使用一个非常通用.允许添加任何类型元素的基类(在.NET中,首先想到的是System ...

  3. C#函数式程序设计之局部套用与部分应用

    函数式设计的核心与函数的应用以及函数如何作为算法的基本模块有关.利用局部套用技术可以把所有函数看成是函数类的成员,这些函数只有一个形参,有了局部套用,才有部分应用.部分应用是使函数模块化成为可能的两个 ...

  4. C#函数式程序设计之函数、委托和Lambda表达式

    C#函数式程序设计之函数.委托和Lambda表达式 C#函数式程序设计之函数.委托和Lambda表达式   相信很多人都听说过函数式编程,提到函数式程序设计,脑海里涌现出来更多的是Lisp.Haske ...

  5. C#函数式程序设计之代码即数据

    自3.5版本以来,.NET以及微软的.NET语言开始支持表达式树.它们为这些语言的某个特定子集提供了eval形式的求值功能.考虑下面这个简单的Lambda表达式: Func<int, int, ...

  6. C#函数式程序设计之用闭包封装数据

    如果一个程序设计语言能够用高阶函数解决问题,则意味着数据作用域问题已十分突出.当函数可以当成参数和返回值在函数之间进行传递时,编译器利用闭包扩展变量的作用域,以保证随时能得到所需要的数据. C#函数式 ...

  7. C#函数式程序设计之惰性列表工具——迭代器

    有效地处理数据时当今程序设计语言和框架的一个任务..NET拥有一个精心构建的集合类系统,它利用迭代器的功能实现对数据的顺序访问. 惰性枚举是一个迭代方法,其核心思想是只在需要的时候才去读取数据.这个思 ...

  8. 转载C#函数式程序设计初探——基础理论篇

    转载网址:http://www.cnblogs.com/Hlia/archive/2013/04/20/3029701.html 个人认为,C#语言的某些设计并不非常适合函数式开发,比如它的类型推断并 ...

  9. Java程序设计9——泛型

    泛型是对集合的补充,JDK1.5增加泛型支持很大程度上都是为了让集合能记住其元素的数据类型.在没有泛型之前,一旦把一个对象丢进Java集合中,集合就会忘记对象的类型,把所有的对象都当成Object类型 ...

随机推荐

  1. hdu Jungle Roads(最小生成树)

    Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of for ...

  2. Android入门——电话拨号器和4种点击事件

    关于HelloWorld为,电话拨号程序还AndroidA入门demo,从这个样例我们要理清楚做安卓项目的思路. 大体分为三步: 1.理解需求,理清思路 2.设计UI 3.代码实现 电话拨号器 1.  ...

  3. oracle_解锁表_解锁用户

    1.解锁用户 以dba身份登录   sqlplus / as sysdba alter user scott account unlock; 2.解锁表 alter   system   kill   ...

  4. java:高速排序算法与冒泡排序算法

     Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /**   *  * @Description:  * @author:cuiyaon ...

  5. 前端学习笔记(zepto或jquery)——对li标签的相关操作(二)

    对li标签的相关操作——8种方式获取li标签的第一个元素的内容 1.alert($("ul>li").first().html());2.alert($('ul>li' ...

  6. ENode 2.0

    ENode 2.0 - 介绍一下关于ENode中对Command的调度设计 摘要: CQRS架构,C端的职责是处理从上层发送过来的command.对于单台机器来说,我们如何尽快的处理command呢? ...

  7. MySQL存储引擎差异化实验

    本篇把MySQL最常用的存储引擎给大家做一个介绍,然后通过插入.修改和并发实验来了解和验证一下它们之间的一些差异. 一.MySQL存储引擎简介 存储引擎在MySQL结构里占据核心的位置,是上层抽象接口 ...

  8. 砸金蛋:jQuery+PHP实现的砸金蛋中奖程序

    原文 砸金蛋:jQuery+PHP实现的砸金蛋中奖程序 砸金蛋被广泛应用于庆典活动.商家促销.电视娱乐等场合,它的趣味.悬念能迅速活跃现场气氛.同样,我们也可以将砸金蛋应用到WEB网站上,用于开展线上 ...

  9. ORACLE 中IN和EXISTS比较

    ORACLE 中IN和EXISTS比较 EXISTS的执行流程      select * from t1 where exists ( select null from t2 where y = x ...

  10. php中echo(),print(),print_r()用法

    原文 php中echo(),print(),print_r()用法 从我对echo(),print(),print_r()这个函数的理解是echo可输入字符串变量常量,print与echo差不多,但p ...