2012-04-23 27 views
9

Có thể tham khảo các loại Java có tên một phần đủ điều kiện không? Nếu vậy, làm thế nào?Loại tham chiếu có không gian tên đủ điều kiện một phần

Kịch bản: Tôi thường xuyên tìm thấy chính mình với một lớp dữ liệu (ví dụ: Activity) cần có chế độ xem. Thực hành tiêu chuẩn của tôi là đặt tên lớp này là , hoạt động, nhưng lớp chế độ xem này luôn kết thúc trong không gian tên tld.organization.project.views, trong đó hậu tố "Chế độ xem" hoàn toàn dư thừa.

Tôi muốn xóa hậu tố "Xem" (vì vậy các loại sẽ là tld.organization.project.Activitytld.organization.project.views.Activity), nhưng điều này có nghĩa là tôi phải sử dụng không gian tên để đủ điều kiện các loại khi tôi tham chiếu chúng trong cùng một lớp. Sử dụng không gian tên để đủ điều kiện tham chiếu kiểu không phải là một điều xấu trong và của chính nó, nhưng lặp đi lặp lại tên đủ điều kiện của một trong hai loại là lặp đi lặp lại và khó đọc.

Tham chiếu một phần loại đủ điều kiện (giống như ~.Activity hoặc ~.views.Activity) sẽ loại bỏ hành trình đó. Một loại kiểu răng cưa nào đó sẽ trả lời, nhưng có vẻ như Java không hỗ trợ chức năng như vậy. Có lựa chọn thay thế nào không?

+0

Bên cạnh 'nhập tld.organization.project.views. *'? –

+0

Tôi không nghĩ rằng việc nhập loại là hữu ích trong trường hợp này, bởi vì các tên ngắn của loại là như nhau. Tôi sẽ cập nhật câu hỏi để làm rõ điều đó. – cqcallaw

+0

Chúng được gọi là 'tên gói' không phải là không gian tên. –

Trả lời

4

Không, bạn không thể làm điều đó với các gói trong Java. Điều gần nhất bạn có thể nhận được là sắp xếp mọi thứ thành các phân cấp lồng nhau của các lớp thay vì các gói. Giữa đó và chiến lược nhập khẩu tĩnh, bạn có thể có được hiệu quả mong muốn, mặc dù nó sẽ là một giải pháp khủng khiếp lộn xộn. Ví dụ:

package tld.organization.project; 
public class Activity {} 

và:

package tld.organization.project; 
public class Views { 
    public static class Activity {} 
} 

mà sau đó có thể được gọi là:

public void whatever() { 
    Activity a = new Activity(); 
    Views.Activity a2 = new Views.Activity(); 
} 

tôi muốn đề nghị rằng những vấn đề bạn đang gặp với tên có thể được trỏ cho một vấn đề thiết kế cần được sắp xếp.

P.S. Nếu tôi đã từng phải làm việc trên một dự án tổ chức các lớp học như vậy, tôi có thể phải tự bắn mình.

P.P.S. Trên thực tế, tôi có thể cố gắng để bắn bạn đầu tiên.

+0

Upvote cho các bản đăng thẳng thắn. ;) Mặc dù vậy, tôi gặp sự cố khi xem các vấn đề về thiết kế của cấu trúc được đề xuất. Đó là một ứng dụng khá đơn giản của mẫu thiết kế MVC. Tôi đã có ấn tượng rằng việc phân tách các mối quan tâm (mô hình dữ liệu và xem dữ liệu trong trường hợp này) gần như được coi là phổ biến * thực hành thiết kế tốt ... – cqcallaw

+2

Tách có nhiều hương vị. Với phạm vi giải thích của "MVC", tôi không muốn giả sử tôi biết ý bạn là gì bởi các lớp "dữ liệu" so với "xem", nhưng tôi thấy chỉ số trong tên gói của bạn về một thực tế mà tôi chưa bao giờ đồng ý : các lớp đóng gói dựa trên "lớp" của ứng dụng họ đang sống. Tức là, có gói "dao" với UserDao, AccountDao, ... và gói "xem" với UserView, AccountView, ... Ý kiến ​​của tôi là nó dễ hiểu hơn và ít bị gói rối hơn để có gói "người dùng" và "tài khoản" thay thế, mỗi gói chứa các lớp có liên quan. –

+0

Thú vị. Tôi có thể thấy những ưu điểm của phương pháp ưa thích của bạn, nhưng tôi không chắc nó giải quyết vấn đề ban đầu của tôi: bất cứ lúc nào hai đơn vị chức năng tương tác (nói rằng "người dùng" DAO cần tương tác với "tài khoản" DAO), chúng ta có cùng vấn đề của các tên không đủ tiêu chuẩn giống hệt nhau. Ngoài ra, có vẻ như bạn muốn được khá chắc chắn không có "lớp" mới có khả năng là cần thiết, vì việc thêm một lớp mới cho mỗi gói cho "lớp" mới sẽ khá mất thời gian. – cqcallaw

-1

bạn đang cố gắng để nói rằng bạn không muốn viết:

tld.organization.project.views.ActivityView 

mỗi khi bạn sử dụng ?

Sử dụng import

ví dụ. Thay vì sử dụng tên đầy đủ của lớp JOptionPane như thế này:

class ImportTest { 
    public static void main(String[] args) { 
     javax.swing.JOptionPane.showMessageDialog(null, "Hi"); 
     System.exit(0); 
    } 
} 

nhập lớp ngay từ đầu như thế này:

import javax.swing.JOptionPane; // Make a single class visible. 

class ImportTest { 
    public static void main(String[] args) { 
     JOptionPane.showMessageDialog(null, "Hi"); 
     System.exit(0); 
    } 
} 

Bây giờ bạn có thể trực tiếp sử dụng JOptionPane trong lớp học của bạn.

+0

Anh ta muốn * một phần * đủ điều kiện tên, tức là 'views.Activity' thay vì' Activity' hoặc 'tld.blablabla.views.Activity'.' – sepp2k

+0

Vâng, xin lỗi câu hỏi của tôi không rõ ràng. Tôi đã cập nhật nó. – cqcallaw

+0

Làm việc vì 'JOptionPane' là một lớp, nhưng ý tưởng là để có thể làm điều gì đó tương tự với một gói. – Daniel

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