2009-04-08 25 views
35

Tôi đã thảo luận khá lâu với một người bạn của tôi về cách sử dụng chính xác và tốt của phương pháp chính trong Java. Về cơ bản, chúng tôi có một lớp học như sau:Phương pháp chính Java, Kiểu mã hóa tốt

public class AnImporter implements Runnable { 
    // some methods, attributes, etc. 
} 

Nhưng phải đặt phương pháp chính ở đâu? Tôi concider nó một thói quen tốt để "giữ mã nơi nó thuộc về", do đó chuyển mã trên vào

public class AnImporter implements Runnable { 
    public static void main(String [] args){ 
    // Startup code for Importer App here 
    } 
    // some methods, attributes, etc. 
} 

Trong khi bạn thân của tôi lập luận rằng "các mã khởi động không có gì để làm với các ứng dụng riêng của mình", do đó nó nên được đặt trong một lớp khác, như thế này:

public class AnImporter implements Runnable { 
    // some methods, attributes, etc. 
} 

public class AnApplication { 
    // Nothing here 
    public static void main(String [] args){ 
    AnImporter a = new AnImporter(); 
    // Startup code here 
    } 
    // Nothing here 
} 

Mặc dù chúng tôi đã thảo luận vấn đề này trong một thời gian nhưng không có kết luận nào là cách tiếp cận tốt hơn trong Java. Ý kiến ​​của bạn về chủ đề này là gì? Ở đâu và quan trọng nhất, tại sao, bạn có đặt phương pháp chính của mình vào nơi bạn đặt nó không?

+0

bạn cần tự hỏi: tại sao (hoặc tại sao không) phương pháp chính thuộc về lớp học đó? –

Trả lời

35

Tôi đồng ý với bạn bè của bạn. Bạn đang xây dựng một dịch vụ có khả năng tái sử dụng trong AnImporter có khả năng có thể được sử dụng trong nhiều chương trình với nhiều chính. Vì vậy, làm cho một trong những đặc biệt chính và nhúng nó trong AnImporter không có ý nghĩa nhiều.

11

Tôi sẽ không gây ô nhiễm cho lớp Runnable bằng phương pháp chính. Điều tương tự cũng xảy ra đối với bất kỳ lớp học nào làm bất cứ điều gì trong ứng dụng của bạn. Nói chung tôi sẽ có một lớp học như thế này:

public class App { 
    public static void main(String args[]) { 
    Thread t = new Thread(new Blah()); 
    t.start(); 
     synchronized (t) { 
     t.wait(); 
     } 
    } 
} 

public class Blah implements Runnable { 
    public void run() { 
    // do normal stuff 
    } 
} 

thay vì:

public class Blah implements Runnable { 
    public void run() { 
    // do normal stuff 
    } 

    public static void main(String args[]) { 
    Thread t = new Thread(new Blah()); 
    t.start(); 
    synchronized (t) { 
     t.wait(); 
    } 
    } 
} 

Nó chỉ cảm thấy sạch hơn.

14

Tôi có thể đi cùng với bạn của bạn vì tôi muốn ra khỏi lớp với phương pháp chính nhanh nhất có thể. Nó giúp tạo điều kiện thử nghiệm khi bạn muốn kiểm tra nguyên tử (chỉ là lớp runnable) hoặc bạn muốn thử nghiệm mọi thứ. Bạn càng sớm ra khỏi phương pháp chính, bạn càng có nhiều lựa chọn hơn. Nếu bạn có một lớp học với phương pháp chính và những thứ khác trong đó, nó có thể trở nên lộn xộn một cách nhanh chóng. (ngay cả khi nó có vẻ không giống như một ví dụ đơn giản như ví dụ bạn mô tả)

Nhưng tôi muốn nói khả năng đọc và khả năng kiểm thử là hai lý do chính để thoát khỏi phương pháp chính (và lớp bao gồm) ASAP . Nhưng hey..that chỉ là tôi;)

+1

Có. Tôi cũng sẽ ra khỏi Applet/JApplet càng sớm càng tốt. –

7

Tôi luôn tách chính từ phần còn lại của mã này, vì nhiều lý do:

1) chính là, theo một cách, một hack để bắt đầu chương trình của bạn từ dòng lệnh. Bất kỳ lớp nào chứa nó phải có một trách nhiệm duy nhất: hãy để chương trình bắt đầu từ dòng lệnh. Bằng cách đặt nó với runnable chính của bạn, bạn đang gây ô nhiễm runnable.

2) Bạn có thể sẽ có nhiều nguồn điện (ví dụ, với các thông số mặc định nào đó, với chế độ đặc biệt, vv)

3) Bạn có thể kết thúc chạy chương trình từ một môi trường khác nhau (ví dụ, một Eclipse plugin hoặc mô-đun OGSI, một applet, một công cụ dựa trên web, v.v.). Trong những trường hợp đó, bạn sẽ muốn hạn chế quyền truy cập vào chính của bạn. Đặt nó với chức năng ngăn chặn điều đó.

4) Đôi khi dễ dàng để lại gói chính trong gói mặc định để thực thi thời gian chạy nhanh hơn (ví dụ, java myblabla par1 par2 par3), nhưng chắc chắn bạn không muốn phần còn lại của mã trong gói mặc định .

+0

+1 cho một câu trả lời tốt, nhưng tôi sẽ nói rằng một trong những không bao giờ nên đặt bất kỳ lớp học trong gói "mặc định", thậm chí không phải là một với chính. –

+0

Tôi thấy rằng những người dùng không quen với Java hoặc những người sử dụng các công cụ dòng lệnh thường thích một lời gọi kiểu C. Họ sẵn sàng "hấp thụ JAR", nhưng đó là chuỗi gói dài mà họ không thích. – Uri

2

Giao diện chính (danh sách chuỗi) gần như vô dụng, ngoại trừ vỏ hệ điều hành.

Chính bạn nên có ít mã nhất có thể.

Thật vậy, public class ThisIsMyApp {...} của bạn sẽ không có gì khác ngoài giao diện OS với công việc thực sự, ở nơi khác.

0

Tôi sẽ tách phương thức chính khỏi mã.

Mặc dù tôi cũng có một loại dự án khác. Nó bao gồm không phải là một chương trình làm việc thực sự cho một giải pháp. Ở đây tôi cần phải chạy các giải pháp khác nhau cho các vấn đề khác nhau bằng cách sử dụng (và phát triển) cùng một thư viện. Các vấn đề khác nhau không song song. Tôi cần phải chạy một vấn đề duy nhất từ ​​IDE của tôi. Tôi thấy thuận tiện khi sử dụng cùng một dự án với một số lượng lớn các lớp với các phương thức PSVM.

Dự án này chứa các giải pháp lập trình cuộc thi cho hơn 400 vấn đề khác nhau. Bạn có tổ chức tốt hơn cho việc này không?

Các vấn đề liên quan