Apex简介

Apex特点

Salesforce为开发者提供了Apex语言。它是一种语法上类似于Java的编程语言,有以下特点:

  • 面向对象
  • 完全在云端处理,包括保存、编译、执行
  • 强类型
  • 大小写不敏感(这一点和其他大部分语言不一样)

Apex的数据类型

Apex中的数据类型分为以下几种:

  • 基本类型。比如整形(Integer),双精度类型(Double),字符串类型(String),布尔值(Boolean),小数类型(Decimal),ID类型等
  • sObject类型。这是Salesforce特有的一种类型,系统中的对象都是继承自sObject类型,比如Account(客户)、Opportunity(机会),还包括各种自定义对象,它们的API名字都以“__c”结尾,比如“Example_Object__c”
  • 集合类型。包括了列表(List),集合(Set),地图(Map)等
  • 枚举类型

基本类型中要注意的地方

  • Boolean类型的值可以是true、false或null

  • Date(日期)和Datetime(日期时间)是两种不同的类型。这两个类型的变量必须使用系统提供的静态方法来创建(比如:DateTime.newInstance())。Date类型的数学运算只限于增减Integer类型的值,Datetime类型的数学运算只限于增减Intger或Double类型的值。两个或更多这些类型的变量之间无法直接进行数学运算,必须使用系统提供的Date或Datetime类的静态方法

  • 在Salesforce中可以定义Currency(货币)类型的字段,这些字段中包含的值默认是Decimal(小数)类型

  • ID类型是Salesforce特有的一个基本类型,由18个大小写不敏感的字符组成。ID类型也有包含15个字符的,这时其值是大小写敏感的

  • String类型的值在Apex中只能使用单引号(')表示,不能使用双引号("),比如:'Hello World!',而非:"Hello World!"

集合类型的初始化语法

// List类型
List<String> exampleList = new List<String>();
List<String> exampleList = new List<String> {'Hello', 'World'};
List<String> exampleList = new String[20];
String[] exampleList = new String[20];

// Set类型
Set<String> exampleSet = new Set<String>();
Set<String> exampleSet = new Set<String> {'Hello', 'World'};

// Map类型
Map<ID, Set<String>> exampleMap = new Map<ID, Set<String>>();
Map<String, String> MyStrings = new Map<String, String> {'a' => 'b', 'c' => 'd'.toUpperCase()};

列表类型List

List类型是最常用的一种集合类型,和数组等价,可以相互转换。

用add()函数可以向列表中添加元素:

List<String> shapes = new List<String> { 'circle', 'rectangle', 'triangle' };

shapes.add('square');

从列表中读取元素可以通过索引的方式,每个列表的索引都是从0开始。

读取元素可以直接用方括号加索引,或者用get()函数加索引:

String shape1 = shapes[0];
String shape2 = shapes.get(1);

for(Integer i=0; i<shapes.size(); i++) {
    // 将内容输出到控制台
    System.debug(shapes[i]);
}

集合类型要注意的部分

  • Set类型中每个元素必须唯一,所以Set类型的变量可以使用contains()函数来检查是否包含某元素,比如:
Set<String> exampleSet = new Set<String> {'a', 'b'};
Boolean result1 = exampleSet.contains('a'); // result1为真
Boolean result2 = exampleSet.contains('c'); // result2为假
  • Map类型的键值(Key)可以是null值

  • 当向Map类型变量中增加值时,如果对应的键值已经存在,则新的值会覆盖原有的值。比如:

Map<String, String> exampleMap = new Map<String, String> {'a' => 'b', 'c' => 'd'};

String result1 = exampleMap.get('a'); // result1的值为'b'

exampleMap.put('a', 'e');

String result2 = exampleMap.get('a'); // result2的值为'e'
  • 当Map类型的键值为String类型时,所有键值都是大小写敏感的(这一点和Apex本身的特点不一样)

常量定义

Apex中使用final关键字定义常量,比如:

public class ExampleClass {
    public static final Integer EXAMPLE_INT_CONST = 200;
}

类型转换

Apex中默认是要求显式类型转换的,比如Integer类型不能直接转换为String类型,而需要使用String类的format()函数。

但是有一些例外:

  • 对于Integer,Long,Double,Decimal四种数值类型,它们形成了一组由低到高的类型层次,所以低层次类型的变量可以自动赋值给高层次类型的变量,比如:
Integer i = 10;
Long l = i;
Double d = l;
Decimal decm = d;
  • ID类型可以使用String类型赋值。但是在运行时,系统会自动检测String类型的值是否是合法的ID值,如果不是,则会抛出异常。比如:
String exampleString = 'abcde';
ID exampleId = exampleString; // 运行时会提示异常,因为字符串的值不是合法的ID类型的值
  • instanceOf()函数可以用来检查一个字符串是否符合某对象的ID类型,比如:
String str = 'abcde';
Boolean result = str instanceOf Account; // 检查字符串str的值是否代表了一个合法的Account对象的ID。这种情况下result的值为假

Apex的类(Class)

和大部分编程语言一样,Apex中可以定义类。类的内部可以定义函数和变量,也可以通过public等关键字控制访问权限。

public class Student { 
    public String name;
    private String studentNumber;

    public String showName() {
        return name;
    }

    public String getNumber() {
        return studentNumber;
    }

    private void setNumber(String num) {
        studentNumber = num;
    }
}

在Apex中,类和类中的方法默认都是private的。如果想让它们变为公有,必须添加public关键字。

类的扩展

使用extends关键字可以扩展类,比如:

public class BaseClass {
    ...
}

public class ExtendedClass extends BaseClass {
    ...
}

共享关键字

在Apex中,每一个类都可以添加共享关键字,即“with sharing”和“without sharing”。

当加入了“with sharing”关键字后,在用户执行该类的时候,系统会参照当前用户的共享权限来决定代码是否执行成功。如果用户对于代码中涉及到的对象、字段没有权限,则该代码会执行失败。

匿名代码段

一个例外的情况是当代码在匿名代码段(Anonymous Blocks)执行的时候,“with sharing”关键字不起作用。匿名代码段可以通过以下方式执行:

  • Developer Console
  • executeAnonymous() SOAP API 方法
  • Force.com IDE

注意,执行匿名代码段的用户必须获得“Apex作者(Author Apex)”的权限。

与此相反,“without sharing”关键字则声明了当前用户的共享权限对于该段代码没有作用。

嵌套类

共享关键字只会影响到当前的类,不会影响到嵌套类。它们可以独立的声明共享规则。比如:

public with sharing OuterClass {
    ...

    public without sharing InnerClass {
        ...
    }
}

在上面的代码段中,外层类OuterClass和嵌套类InnerClass的共享设定是不同的,它们相互独立。

Apex的逻辑语句

在Apex中也有着各种逻辑语句,比如“if...else”、“for”、“while”和“do...while”。

有一点要注意的是,截至本文的时间(Apex版本v41.0),在Apex中没有“switch”语句。

Developer Console简介

Salesforce中的Developer Console是默认的集成开发环境,用来进行Apex和数据库的编程和操作。

在Salesforce中主界面点击右上角的用户名菜单,在下拉列表中点击“Developer Console”。

进入Developer Console

建立新的Apex类

在Developer Console主界面,点击“File”,指向“New”,在子菜单中选择“Apex Class”。在弹出的对话框中输入类名,即可建立新的Apex类。

建立新Apex类

在中间的编辑区域即可对类进行编辑。

编辑Apex类

控制台

界面下方的区域是控制台,可以查看日志(Log)、运行测试(Tests)、进行数据查询(Query Editor)等。

控制台
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,625评论 18 399
  • 裘思博本期嘉宾 裘思博(Fledman),来自Salesforce 中国区最具创新能力合作伙伴 Celnet雨花石...
    Salesforce阅读 8,669评论 0 18
  • 看到老師的類比也驚了,才發現大家都有足量的資源,端看有沒有能力消費,為什麼同樣是1440分鐘,有些人卻可活出288...
    腦子長在手上阅读 139评论 0 0
  • 北京,十一月。 气温开始变凉了,宿舍里面依旧没有暖气,感觉就像冰窖一下,每天早上都要把自己裹成熊宝宝才起床。还是会...
    白白君阅读 577评论 0 0