2012-01-29 44 views
7

Tôi đang cố gắng khởi tạo một lớp tĩnh, với đối số và sau đó chạy một số mã tĩnh khác trong lớp đó.
Tôi biết khối static, nhưng có vẻ như nó không thể lấy bất kỳ đối số nào.
Có cách nào để chuyển đối số cho một hàm tạo tĩnh không?
Nếu không, kỹ thuật được khuyến nghị để khởi tạo một lớp tĩnh bằng cách sử dụng một đối số là gì?Gửi đối số cho một hàm tạo tĩnh trong Java?

Edit: Một lớp tĩnh để hiểu biết của tôi là một lớp mà không thể được khởi tạo (trong C# chúng được gọi là lớp tĩnh, nếu Java có một thuật ngữ khác nhau đối với họ, xin lỗi vì không nhận thức được nó) - nó được truy cập thông qua tên lớp của nó chứ không phải là tên đối tượng.

Điều tôi đang cố gắng đạt được (rất đơn giản) là một lớp nhận từ điển dưới dạng Chuỗi, phân tích cú pháp và có phương pháp thao tác nó như GetRandomEntry.

Dưới đây là một đoạn xây dựng mã của tôi:

public class QuestionsRepository { 
private static Map<String,String[]> easyDefinitions = new HashMap<String,String[]>(); 

//... 

static  
    { 
    // need to receive and parse dictionary here  
    } 
//... 

Lấy phần liên quan của một đoạn mã không bao giờ dễ dàng, hy vọng tôi đã chọn một cách khôn ngoan (:
Một chi tiết mà có thể liên quan - Tôi aC# lập trình viên, thường. chỉ cần Bắt đầu học Java thời gian gần đây.

Cảm ơn.

+1

này đang hướng trong sai hướng. Bất kỳ lý do cụ thể bạn không thể chỉ sử dụng một constructor bình thường trong một lớp không tĩnh? –

+2

'Lớp tĩnh' trong sự hiểu biết của bạn là gì? –

+0

Một mẫu mã sẽ giúp mọi người hiểu câu hỏi và bối cảnh của bạn tốt hơn. –

Trả lời

12

Tôi nghĩ bạn cần phải khởi tạo các trường tĩnh của lớp theo một số đầu vào. Bạn có thể làm điều đó theo cách sau bằng cách gọi phương thức tĩnh của lớp khác:

class ClassToInitialize { 
    static { 
     staticField = ParamPassClass.getParameter(); 
    } 

    private static String staticField; 

    ClassToInitialize() { 
     System.out.println("This is the parameter: " + staticField); 
    } 

} 

class ParamPassClass { 
    private static String parameter; 
    static String getParameter() { 
     return parameter; 
    } 

    static void setParameter(String parameter) { 
     ParamPassClass.parameter = parameter; 
    } 
} 

class Main { 
    public static void main(String args[]) { 
     ParamPassClass.setParameter("Test param"); 
     new ClassToInitialize(); 
    } 
} 
+0

Vì vậy, tôi sẽ có một lớp học chỉ để giữ Các thông số âm thanh thông minh nhưng một chút vụng về Mặt khác, nếu đó là cách duy nhất để đi .. (?) –

+0

.. Và quan trọng hơn - là nó đảm bảo rằng khối tĩnh tại ClassToInitialize sẽ chạy sau khi SetParameter? –

+0

Nó không có nghĩa là bạn cần giữ một đối tượng chỉ để giữ tham số, nó giống như, bạn có thể gọi phương thức 'static' trực tiếp để truyền giá trị, gần giống như tham số truyền. một đối tượng bên trong khối tĩnh và lấy thứ giá trị tham số e theo yêu cầu. Phụ thuộc vào việc sử dụng và thiết kế của bạn. –

2

Java không có nhà thầu tĩnh. Nó chỉ có initializers tĩnh và initializers tĩnh không có bất kỳ đối số. Nó được thực hiện khi lớp được nạp lần đầu tiên và không có cách nào để tự gọi nó.

Bạn cần phải sử dụng các đối tượng thực tế hoặc thêm một số cách định cấu hình lớp (ví dụ: thông qua phương pháp tĩnh).

1

bạn nên đề cập đến lớp thành viên có vòng loại tĩnh, nếu không thì không có điều gì như lớp tĩnh Here bạn có thể tìm giải thích về cách sử dụng từ 'tĩnh' trong ngữ cảnh này.

Bây giờ bạn chỉ cần gọi hàm khởi tạo và chuyển tất cả các đối số bạn muốn, hạn chế duy nhất mà bạn có trong lớp thành viên tĩnh là nó không thể tham chiếu các trường không tĩnh của lớp ngoài của nó một phương thức tĩnh trên lớp không thể tham chiếu các trường không tĩnh của lớp.

Tôi không hiểu tại sao bạn đề cập đến một khối khởi tạo tĩnh ở đây, bạn có thể làm rõ một chút không? Hãy nhận biết cũng trong java không có một điều như vậy constructor như tĩnh ....

Hope this helps

+0

bạn có nghĩa là một lớp không có bộ sửa đổi tĩnh và một hàm tạo cũng không có bộ sửa đổi tĩnh, cả hai đều là tĩnh trong Java theo mặc định? (chỉnh sửa câu hỏi btw, để làm cho nó rõ ràng hơn) –

0

Bạn có thể có một phương pháp tĩnh public static void setUp(Arg1 arg1, Arg2 arg2...) đó thiết lập tất cả static lĩnh vực của bạn và gọi nó khi bạn chương trình bắt đầu.

Bạn phải chắc chắn rằng phương pháp này sẽ được gọi là một lần duy nhất [hoặc chỉ khi bạn muốn thiết lập lại các lĩnh vực này]

+0

Nhưng làm thế nào tôi sẽ đảm bảo rằng phương pháp chạy TRƯỚC KHI mã tĩnh khác của tôi? Xin lỗi vì sự chậm trễ, nhưng xin vui lòng tham khảo chỉnh sửa của tôi. Cảm ơn (: –

+0

@ORenA: bạn có thể thêm một cờ riêng tư, sẽ được initalized thành 'false' trong một khối tĩnh và sẽ được đặt thành' true' khi 'setUp()' được kích hoạt. lá cờ và ném một 'IllegalStateException' nếu nó là sai.Tôi đồng ý giải pháp này không phải là tốt nhất, là chỉ là một thô thaught về cách bạn có thể khởi tạo với các thông số ... – amit

0

Không thể để vượt qua đối số trực tiếp đến việc khởi tĩnh (JLS:static initializers).

Sẽ thật tuyệt nếu bạn có thể chia sẻ thêm thông tin về mục tiêu của mình.

0

Bạn có thể sử dụng một enum để khởi tạo một singleton với một tham số chuỗi như thế này

import java.util.*; 
class Data { 
    static Map<String,String[]> easyDefinitions = new HashMap<String,String[]>(); 
} 
public enum QuestionsRepository 
{ 
    repository("primary=red,green,blue;secondary=cyan,yellow,magenta"); 
    QuestionsRepository(String dictionary) { 
     String[] rules = dictionary.split(";"); 
     for (String rule:rules) { 
      String[] keyValuePair = rule.split("=",2); 
      Data.easyDefinitions.put(keyValuePair[0],keyValuePair[1].split(",")); 
     } 
    } 
} 
Các vấn đề liên quan