【Salesforce】JavaエンジニアがApexをはじめたときにつまずいたこと
はじめに
こんにちは。CREFILでエンジニアをしている松井です。この記事では、Javaの開発経験があるエンジニアがApexでの開発をはじめるときにつまずくであろう、気をつけるべきことをご紹介します。
「ApexはJavaに似てるからJavaができればすぐできるでしょ」と巷ではよく言われているようです。たしかに、基本的な文法はよく似ていてとっつきやすいのは間違いないです。ただその反面、似ているがゆえにかえって微妙な違いに戸惑うこともしばしば、というのが実感です。
そもそも似ていない点であれば、Apexはこういうものかと理解すればよいのですが、なまじ書き方が同じだから同じと思い込み深堀りせずに進めていたら後で困ってしまうことがありました。そうした私自身のつまずいた経験を共有することで、同じような境遇の方々の参考になれば幸いです。
Apexとは
まず、いまさらだとは思いますが、一応改めてここで確認しておきます。Apexとは、Salesforceのサーバで動作するプログラミング言語です。強く型付けされたオブジェクト指向言語で、基本的にはJavaに非常によく似た文法構造となっています。
Apexの概要
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_intro.htm
ApexとJavaとの違い
1. 大文字小文字の区別がない
Apexは大文字小文字を区別しません。Javaに限らず現在主流であるプログラミング言語は大文字小文字を区別するものがほとんどですので、意表を突かれます。
ただ、ネーミングルールとしてはJava標準を推奨となっています。つまり、コーディングは大文字小文字の区別を意識して名前付けを行うことが前提となります。
Javaでは、クラス名が先頭大文字のパスカルケース、変数名が先頭小文字のキャメルケースが標準のネーミングルールであるため、クラス名の先頭を小文字にして変数名として使用することがよくあると思います。
例えばこんな感じです。注文商品`OrderItem`クラスのインスタンスを作成します。
OrderItem orderItem = new OrderItem();
しかし、Apexではこう書いても同じです。
ORDERITEM OrderItem = new orderItem();
ぱっと見でわかりづらいです。もちろん、意図的にこのようなややこしい記述をすることはないと思います。
しかし、言語として大文字小文字の区別をしていないため、統一されていなくともコンパイルエラーとなりません。結果として、記述誤りに気付けずにコードの可読性が損なわれるおそれがあるため、注意が必要となります。
また、このような事情のため、クラス名の先頭を小文字にして変数名と使用するのは避けた方が懸命です。
Java標準のネーミングルール
https://www.oracle.com/java/technologies/javase/codeconventions-namingconventions.html
Apex 名前付け規則
2. 予約語が多い
予約語とは、プログラミング言語の仕様に定められているため、開発者が変数名など識別子として使用できない単語です。Javaであれば、`public`とか`class`とか`if`とか、変数名には使えないですね。
この予約語の数が、Javaが51語であるのに対して、Apexは121語とJavaの2倍以上あります。Javaでは変数名として使用できる単語を使用していたら、思いがけずコンパイルエラーが発生するため、注意が必要です。
個人的に、Javaでは次のような単語を変数名としてよく使用していましたが、Apexでは予約語のため使用できません。前述した大文字小文字の区別がないという点も関連して、はじめた当初はよく引っかかってしまいました。
array
list
map
date
time
currency
object
例えば、Javaであれば、配列にはシンプルにこんな変数名をつけることがあると思います。
String[] array = new String[2];
array[0] = "AA";
array[1] = "BB";
しかし、Apexで同じように書くと、`array`が大文字小文字の区別なく予約語であるため、コンパイルエラーとなります。
あと、もう一点、これは単純な差異として、Stringのリテラル値の記述方法が異なり、Javaではダブルクォーテーション「"」で囲みますが、Apexではシングルクォーテーション「'」で囲みます。
ちなみに、Javaではシングルクォーテーション「'」はchar型のリテラル値で使用しますが、Apexにはchar型のような『文字』を表す型は存在せず、文字も文字列もすべてString型で表します。
というわけで、Apexに書き換えるとこうなります。
String[] stringArray = new String[2];
stringArray[0] = 'AA';
stringArray[1] = 'BB';
「変数名には具体的な名前をつけるべき」というご指摘があれば、まったくその通りです。しかしながら、ユーティリティメソッドなどではあえて抽象的な変数名を使用したい場合もあると思いますので、そのような場合には注意が必要となります。
Javaの予約語
https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.9
Apexの予約語
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_reserved_words.htm
おわりに
いかがでしたでしょうか。
本当に一部のみではありますが、ApexとJavaの違いで注意が必要なことのご紹介でした。
ご覧いただきありがとうございました。