سؤال
النظر من خلال بعض كود جافا وهذا لا يبدو صحيحا. بالنسبة لي ، يبدو أنه في كل مرة تتصل فيها بالمشاريع ، ستحصل على هاشم جديد ، بحيث يكون هذا البيان دائمًا خطأ
projects.get(soapFileName) != null
يبدو أنه يجب أن يكون له مجال دعم
public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject>();
public Object[] argumentsFromCallSoapui(CallT call, Vector<String> soapuiFiles, HashMap theDPLs,int messageSize)
{
try {
for (String soapFileName:soapuiFiles){
System.out.println("Trying "+soapFileName);
WsdlProject project ;
if (projects.get(soapFileName) != null){
project = projects.get(soapFileName);
} else {
project = new WsdlProject(soapFileName);
projects.put(soapFileName,project);
}
}
} ...
}
المحلول
لا. في Java هذا المتغير الثابت يتم تهيئته مرة واحدة فقط.
لذلك ، سيتم استدعاء هذا الخط مرة واحدة فقط.
public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject> ();
نصائح أخرى
ال المشاريع سيتم تهيئة المتغير مرة واحدة ، عند تحميل الفئة الأولى.
بشكل عام ، تعتبر الخرائط الثابتة من هذا النوع فكرة سيئة: فهي غالبًا ما تتحول إلى تسرب الذاكرة ، حيث تمسك بالمداخلات التي تمر لفترة طويلة.
في هذه الحالة بالذات ، أشعر أيضًا بالقلق بشأن سلامة الخيط. إذا كان لديك عدة مؤشرات ترابط تدعو هذه الطريقة (والتي من المحتمل أن تكون في التعليمات البرمجية التي تتعامل مع خدمات الويب) ، فستحتاج إلى مزامنة الوصول إلى الخريطة أو يمكنك إفسادها.
وفي ملاحظة أناقة عامة ، من الجيد تحديد المتغيرات باستخدام الفئة الأقل تقييدًا: في هذه الحالة ، الواجهة خريطة, ، بدلاً من الفئة الملموسة خريطة التجزئة.
لم تكن مكالمة projects
- إنه حقل وليس طريقة.
نظرًا لأنه حقل ثابت ، فسيتم تهيئته مرة واحدة بالضبط (Modulo نفس النوع الذي يتم تحميله في متعددة من أدوات تحميل الفئات).
إذا قمت بإضافة initialiser ثابت (مُنشئ ثابت؟) ، فستتمكن من رؤية أن الإحصائيات يتم تهيئة فقط في المرة الأولى التي يتم فيها تحميل الفصل:
public class Hello {
static { System.out.println("Hello static World!"); }
...
}
لن تحصل على hashmap جديد في كل مرة تستدعي طريقة في المشاريع ، إذا كان هذا ما تشير إليه. سيتم إنشاء HashMap الجديد مرة واحدة ، ولكن جميع حالات الفصل ستشارك HashMap واحد.