Similar solution, slightly slower (~131 ms) and slightly more compact:

public class Solution {
public boolean makesquare(int... nums) {
long sum = Arrays.stream(nums).sum();
if ((sum == 0) || (sum & 3) > 0) return false;
else {
nums = Arrays.stream(nums).boxed().sorted(Comparator.reverseOrder()).mapToInt(i -> i).toArray();
long side = sum >>> 2;
return (nums[0] <= side) && canMakeSquare(nums, 0, side, side, side, side);
}
}
boolean canMakeSquare(int[] nums, int index, long sum1, long sum2, long sum3, long sum4) {
if (index >= nums.length) return (sum1 | sum2 | sum3 | sum4) == 0;
else return ((sum1 >= nums[index]) && canMakeSquare(nums, index + 1, sum1 - nums[index], sum2, sum3, sum4))
|| ((sum2 >= nums[index]) && canMakeSquare(nums, index + 1, sum1, sum2 - nums[index], sum3, sum4))
|| ((sum3 >= nums[index]) && canMakeSquare(nums, index + 1, sum1, sum2, sum3 - nums[index], sum4))
|| ((sum4 >= nums[index]) && canMakeSquare(nums, index + 1, sum1, sum2, sum3, sum4 - nums[index]));
}
}