次のコードサンプルのようなものを使用します。シングルトンパターンを使用して、トランザクションの期間中、情報をメモリに静的に格納します。twamleyが提案した遅延読み込みに似ていますが、これははるかに単純なアプローチだと思います。
使用法1:UserUtil.CurrentUser.Email;
使用法2:ユーザーsomeUser = UserUtil.getUser(someUserId);
これにより、現在のユーザーまたはシステム内の他のユーザーの同じ情報にアクセスできるようになります。queryUsersメソッドはクエリ結果を返すだけであることに注意してください。これにより、クエリが独自のメソッドで分離されるため、クエリのフィールドの追加と削除が簡単になり、作業が簡単になります。
注:このコードを使用すると、すべてのユーザーが取り込まれることに注意してください。ほとんどの組織には数百人のユーザーがいないため、ヒープサイズは問題になりません。ただし、そうであれば、queryUsers()メソッドを変更して、アクティブなユーザーのみを返すか、他の基準に基づいてフィルターをかけることができます。
public class UserUtil {
//Protected Members
private static final UserUtil instance = new UserUtil();
private Map<Id, User> mapUsers;
//Properties
public static User CurrentUser {
get { return getUser(UserInfo.getUserId()); }
}
//Constructor
private UserUtil() {
mapUsers = new Map<Id, User>(queryUsers());
}
//Public Methods
public static User getUser(Id userId) {
if (instance.mapUsers.containsKey(userId)) {
return instance.mapUsers.get(userId);
}
else {
throw new InvalidUserIdException('Unable to locate user id: ' + userId);
}
}
//Private Methods
private List<User> queryUsers() {
return [SELECT
Id
, Name
, UserName
, Email
, Alias
FROM
User];
}
//Internal Classes
public class InvalidUserIdException extends Exception {}
}