মঙ্গলবার, মার্চ 9, 2010 এ 03:02 এ, কেভিন এল স্টার্ন লিখেছেন:
আমি একটি তাত্ক্ষণিক অনুসন্ধান করেছি এবং এটি প্রদর্শিত হচ্ছে যে জাভা প্রকৃতপক্ষে দু'জনের পরিপূরক। তবুও, দয়া করে আমাকে এটি উল্লেখ করার অনুমতি দিন, সাধারণভাবে, এই ধরণের কোডটি আমাকে চিন্তিত করে যেহেতু আমি পুরোপুরি প্রত্যাশা করি যে কোনও সময় কেউ আসবেন এবং ডাইমাইট্রোর পরামর্শ মতো ঠিক করবেন; যে কেউ পরিবর্তন হবে:
if (a - b > 0)
প্রতি
if (a > b)
এবং পুরো জাহাজ ডুবে যাবে। আমি ব্যক্তিগতভাবে, আমার অ্যালগরিদমের জন্য পূর্ণসংখ্যার ওভারফ্লো তৈরির মতো অস্পষ্টতা এড়াতে চাই যদি না করার উপযুক্ত কারণ না থাকে। আমি সাধারণভাবে ওভারফ্লো পুরোপুরি এড়িয়ে যাওয়া এবং ওভারফ্লো দৃশ্যটিকে আরও স্পষ্ট করে তুলতে পছন্দ করব:
if (oldCapacity > RESIZE_OVERFLOW_THRESHOLD) {
// Do something
} else {
// Do something else
}
এটি একটি ভাল পয়েন্ট।
ইন ArrayListআমরা এটা করতে পারেন না (বা অন্তত compatibly নয়), কারণ
ensureCapacityএকটি পাবলিক এপিআই এবং কার্যকরভাবে ইতিমধ্যে একটি ইতিবাচক ধারণক্ষমতা যে সন্তুষ্ট করা যাবে না জন্য অনুরোধ হিসাবে ঋণাত্মক সংখ্যা গ্রহণ করে।
বর্তমান এপিআই এর মতো ব্যবহৃত হয়:
int newcount = count + len;
ensureCapacity(newcount);
আপনি যদি ওভারফ্লো এড়াতে চান তবে আপনার খুব কম প্রাকৃতিক কিছুতে পরিবর্তন করতে হবে
ensureCapacity(count, len);
int newcount = count + len;
যাইহোক, আমি ওভারফ্লো-সচেতন কোড রাখছি, তবে আরও সতর্কতা মন্তব্য যুক্ত করছি, এবং "আউট-আস্তরণের" বিশাল অ্যারে তৈরি করা যাতে
ArrayListকোডটি এখন দেখতে লাগে তেমন:
/**
* Increases the capacity of this <tt>ArrayList</tt> instance, if
* necessary, to ensure that it can hold at least the number of elements
* specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
public void ensureCapacity(int minCapacity) {
modCount++;
// Overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// Overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
private int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
ওয়েব্রেভ পুনরুত্থিত।
মার্টিন
if (newCapacity - minCapacity < 0)ভালif (newCapacity < minCapacity)?