tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Spring'20の新機能 - Apexの新規および変更された項目を試してみました

"この記事は Salesforce 開発者向けブログキャンペーンへのエントリー記事です。"
Spring'20の新機能 - Apexの新規および変更された項目を試してみました。

f:id:tyoshikawa1106:20200309074701p:plain

リリースノート


Auth 名前空間とReports 名前空間のやつはよくわからないのでスキップ。

Schema 名前空間

新しく追加されたのは下記の機能です。
f:id:tyoshikawa1106:20200309074927p:plain

項目の sObject 結果の記述を取得し、子リレーションを読み込むか、またはパラメータ値に基づかないかを決定する
Schema.SObjectType クラスの新しい getDescribe(options) メソッドを使用します。


詳細はApex開発者ガイドに記載がありました。
f:id:tyoshikawa1106:20200309075200p:plain

パラメータ値は、組織スキーマの重要な更新の改善されたキャッシュを有効化すると共に、記述操作の要素の読み込み方法を決定します。

SObjectDescribeOptions.FULL を使用して、用途メソッドの呼び出し前に、子リレーションを含む記述のすべての要素を一括で読み込みます。この記述は、必ず完全に一貫した結果になります。これは、記述オブジェクトが別の名前空間、API バージョン、その他の Apex コンテキストに渡されて、記述属性の生成時に異なる結果になる可能性がある場合でも同様です。

子リレーションの遅延読み込みを行うには、SObjectDescribeOptions.DEFERRED を使用します。これは、メソッドの最初の呼び出し時に一部の子リレーションが読み込まれないことを意味します。

SObjectDescribeOptions.DEFAULT を使用して、API バージョンに応じて、デフォルトが一括読み込みと遅延読み込みのいずれかになるようにします。


処理の書き方はこんな感じ。

// FULL
Schema.DescribeSObjectResult result1 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.FULL);
System.debug(result1);
// DEFERRED
Schema.DescribeSObjectResult result2 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.DEFERRED);
System.debug(result2);
// DEFAULT
Schema.DescribeSObjectResult result3 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.DEFAULT );
System.debug(result3);

実行した結果はこんな感じ。情報量が多すぎてよくわからず。
f:id:tyoshikawa1106:20200309080340p:plain


戻り値のDescribeSObjectResult クラスでできることを確認してみました。
f:id:tyoshikawa1106:20200309080445p:plain

Salesforce Developers


例えばfieldsの場合はgetMapと組み合わせて使うと記載があるのでこんな感じ。

// FULL
Schema.DescribeSObjectResult result1 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.FULL);
System.debug(result1.fields.getMap());
// DEFERRED
Schema.DescribeSObjectResult result2 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.DEFERRED);
System.debug(result2.fields.getMap());
// DEFAULT
Schema.DescribeSObjectResult result3 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.DEFAULT );
System.debug(result3.fields.getMap());

f:id:tyoshikawa1106:20200309080705p:plain


fieldsで使い方のイメージがついたところで子リレーションが関係していそうな処理を探してみると..ありました。
f:id:tyoshikawa1106:20200309080851p:plain


取引先オブジェクトを対象に実行してみると

// FULL
Schema.DescribeSObjectResult result1 = Schema.Account.SObjectType.getDescribe(SObjectDescribeOptions.FULL);
System.debug(result1.getChildRelationships());
// DEFERRED
Schema.DescribeSObjectResult result2 = Schema.Account.SObjectType.getDescribe(SObjectDescribeOptions.DEFERRED);
System.debug(result2.getChildRelationships());
// DEFAULT
Schema.DescribeSObjectResult result3 = Schema.Account.SObjectType.getDescribe(SObjectDescribeOptions.DEFAULT );
System.debug(result3.getChildRelationships());


オプションは指定できていますが、実行結果の違いはよくわからず。
f:id:tyoshikawa1106:20200309081130p:plain


使い道はわかりませんでしたが、getDescribeで新しく追加されたオプションの指定方法はこんな感じで宣言できるみたいです。

System 名前空間

System名前空間で追加されたのは下記の機能です。
f:id:tyoshikawa1106:20200309081328p:plain

ページ URL リダイレクトを制御するリダイレクトコードの指定
PageReference クラスの新しい setRedirectCode(redirectCode) メソッドを使用して、301、302、303、307、308 の redirectCode を指定します。新しい getRedirectCode() メソッドは、PageReference redirectCode を返します。

List コレクション型の文字列表現の取得
System.List クラスの新しい toString() メソッドを使用します。

Map コレクション型の文字列表現の取得
System.Map クラスの新しい toString() メソッドを使用します。

Set 型の文字列表現の取得
System.Set クラスの新しい toString() メソッドを使用します。

ページ URL リダイレクトを制御するリダイレクトコードの指定

setRedirectCode(redirectCode) メソッドが追加されたそうです。これでリダイレクトコードというのを取得できるようになったみたいです。


処理の書き方はこんな感じ。

PageReference pageRef = new PageReference('http://www.google.com');
pageRef.setRedirectCode(301);
System.debug(pageRef.getRedirectCode());

f:id:tyoshikawa1106:20200309081751p:plain

詳細はこちら。

https://developer.salesforce.com/docs/atlas.ja-jp.224.0.apexcode.meta/apexcode/apex_system_pagereference.htm?search_text=List#stq=List&stp=1

新しい toString() メソッド

ListとMapとSetで使えるようになった新機能です。使い方のイメージが付きやすかったので開発者ガイドはノーチェックですが、こんな感じ。

// List Class
List<String> sample1 = new List<String>{'サンプル1', 'サンプル2', 'サンプル3'};
String result1 = sample1.toString();
System.debug(result1);

// Map Class
Map<String, String> sample2 = new Map<String, String>();
sample2.put('key1', 'value1');
sample2.put('key2', 'value2');
sample2.put('key3', 'value3');
String result2 = sample2.toString();
System.debug(result2);

// Set Class
Set<String> sample3 = new Set<String>{'サンプル4', 'サンプル5', 'サンプル6'};
String result3 = sample3.toString();
System.debug(result3);

f:id:tyoshikawa1106:20200309082446p:plain


Mapとかどうなるのかなと思いましたが、KeyとValueと両方がそのままString型になりました。リスト型やセット型はString型以外の場合にどう変換されるかはまたの機会に確認しようかなと思います。


Spring'20の新機能 - Apexの新規および変更された項目はだいたいこんな感じでした。知らなくても特に困らないですが、知っておくと役立つ機会があるかもしれない感じの機能という印象でした。