2010-01-17 23 views
73

Nói rằng tôi đã là một mã như:Nhập hai lớp có cùng tên. Làm thế nào để xử lý?

import java.util.Date; 
import my.own.Date; 

class Test{ 

    public static void main(String [] args){ 

    // I want to choose my.own.Date here. How? 
    .. 
    // I want to choose util.Date here. How ? 

    } 
} 

Tôi có nên được đầy đủ tên lớp đủ điều kiện? Tôi có thể loại bỏ các báo cáo nhập khẩu không? Đó có phải là một kịch bản phổ biến trong lập trình thế giới thực không?

+0

Không thực sự là một câu trả lời cho câu hỏi của bạn nhưng trong C# bạn có thể sử dụng một bí danh cho bất kỳ không gian tên nào. Có thể đó chỉ là cú pháp nhưng nó thực sự hữu ích: http://msdn.microsoft.com/en-us/library/7f38zh8x.aspx – borjab

Trả lời

108

Bạn có thể bỏ qua các câu lệnh nhập và tham khảo chúng bằng cách sử dụng toàn bộ đường dẫn. Ví dụ:

java.util.Date javaDate = new java.util.Date() 
my.own.Date myDate = new my.own.Date(); 

Nhưng tôi sẽ nói rằng sử dụng hai lớp có cùng tên và hàm tương tự thường không phải là ý tưởng hay nhất trừ khi bạn có thể làm rõ nó là cái gì.

+1

Nếu bạn đang sử dụng Eclipse, bạn có thể thay đổi tên của ' your.own.Date' bằng ctrl + shift + R. Điều này sẽ tự động thay đổi nó ở mọi nơi bạn tham chiếu đến nó trong mã của bạn, cũng như trong tệp (và tên tệp) của bạn/own/Date.java của bạn. Bất kỳ IDE nào khác có thể có một tính năng tương tự. – MatrixFrog

+12

Tôi không đồng ý với tuyên bố cuối cùng. Nếu bạn muốn thiết kế lớp Date của riêng bạn, 'Date' là tên hoàn hảo. Bạn sẽ sử dụng nó trong hầu hết mã của bạn. Tuy nhiên, đôi khi bạn sẽ cần phải gọi 'java.util.Date' đáng chú ý để thực hiện chuyển đổi giữa cả hai. – paradigmatic

+1

@MatrixFrog Tính năng trong Eclipse mà bạn đã chỉ định cũng được cung cấp bởi Netbeans IDE. Tính năng này được gọi là "Refactor". Thông tin của bạn không sai nhưng nó không phải là câu trả lời của câu hỏi được hỏi. Nếu anh ta (Roger) đang phát triển mã đó, thì chắc chắn anh ta biết rằng anh ta có thể thay đổi hoặc tái cấu trúc tên của lớp của mình. Những gì anh ta hỏi là khác với câu trả lời bạn đã đưa ra. –

15

sử dụng tên đủ điều kiện thay vì nhập lớp học.

ví dụ:

//import java.util.Date; //delete this 
//import my.own.Date; 

class Test{ 

    public static void main(String [] args){ 

     // I want to choose my.own.Date here. How? 
     my.own.Date myDate = new my.own.Date(); 

     // I want to choose util.Date here. How ? 
     java.util.Date javaDate = new java.util.Date(); 
    } 
} 
+6

Thực hành tốt nhất là nhập khẩu được sử dụng nhiều nhất, sử dụng ít nhất được sử dụng với đầy đủ classpath – Alpaslan

7

Có, khi bạn nhập các lớp có cùng tên đơn giản, bạn phải tham khảo chúng theo tên lớp hoàn toàn đủ điều kiện. Tôi sẽ để lại các báo cáo nhập khẩu, vì nó cung cấp cho các nhà phát triển khác một cảm giác về những gì có trong tệp khi họ đang làm việc với nó.

java.util.Data date1 = new java.util.Date(); 
my.own.Date date2 = new my.own.Date(); 
2

Kịch bản này không quá phổ biến trong lập trình trong thế giới thực, nhưng cũng không quá lạ. Nó xảy ra đôi khi hai lớp trong các gói khác nhau có cùng tên và chúng ta cần cả hai.

Không bắt buộc nếu hai lớp có cùng tên, thì cả hai đều có cùng chức năng và chúng tôi chỉ nên chọn một trong số chúng.

Nếu chúng ta cần cả hai, thì không có hại gì khi sử dụng. Và nó cũng không phải là một ý tưởng lập trình tồi.

Nhưng chúng ta nên sử dụng tên đủ điều kiện của các lớp học (có cùng tên) để làm cho nó rõ ràng lớp chúng tôi đang giới thiệu quá.

:)

2

Nếu bạn có lớp ngày của riêng bạn, bạn nên phân biệt nó được tạo sẵn trong lớp Ngày. tức là tại sao bạn tạo riêng của mình. Một cái gì đó như ImmutableDate hoặc BetterDate hoặc NanoDate, thậm chí MyDate sẽ cho biết lý do tại sao bạn có lớp ngày của riêng bạn. Trong trường hợp này, họ sẽ có một tên duy nhất.

6

Một cách khác để làm điều đó là lớp con nó:

package my.own; 

public class FQNDate extends Date { 

} 

Và sau đó nhập my.own.FQNDate trong các gói có java.util.Date.

+0

Tôi làm như thế này ngoại trừ (nó là đơn giản) tuy nhiên nó không giải quyết vấn đề cho nói truy cập phương pháp tĩnh. –

+0

Tôi làm điều này tất cả thời gian khi tôi muốn sử dụng Hamcrest 'Matchers' và Mockito' Matchers' trong cùng một lớp. Dường như nó hoạt động với các phương thức tĩnh. – Kidburla

+0

@Kidburla bạn cũng có thể sử dụng các lần nhập tĩnh miễn là bạn không quan tâm đối sánh nào đến từ đâu. Tôi thường làm điều này trong các bài kiểm tra đơn vị cho matchers và '.when's,' .thenReturn's vv - loại bỏ các 'Mockito.' sưng lên. – CptBartender

2

Tôi đã gặp vấn đề này khi, ví dụ, ánh xạ lớp này sang lớp khác (chẳng hạn như khi chuyển sang một nhóm lớp mới để đại diện cho dữ liệu người). Tại thời điểm đó, bạn cần cả hai lớp vì đó là toàn bộ điểm của mã - để ánh xạ bản đồ với nhau. Và bạn không thể đổi tên các lớp ở một trong hai nơi (một lần nữa, công việc là lập bản đồ, không thay đổi những gì người khác đã làm).

Đủ điều kiện là một cách. Có vẻ như bạn không thể bao gồm cả hai câu lệnh import, bởi vì Java lo lắng về việc "Person" có nghĩa là gì, ví dụ.

2

Bạn có thể nhập một trong số chúng bằng cách nhập. Đối với tất cả các lớp tương tự khác, bạn cần chỉ định tên lớp đầy đủ.Nếu không, bạn sẽ nhận được lỗi biên dịch.

Ví dụ:

import java.util.Date; 

class Test{ 

    public static void main(String [] args){ 

    // your own date 
    my.own.Date myOwndate ; 

    // util.Date 
    Date utilDate; 
    } 
} 
0

Tôi chỉ có cùng một vấn đề, những gì tôi đã làm, tôi sắp xếp thứ tự thư viện theo thứ tự, ví dụ có java.lang.NullPointerException và javacard.lang.NullPointerException. Tôi đã tạo thư viện đầu tiên làm thư viện mặc định và nếu bạn cần sử dụng thư viện khác, bạn có thể chỉ định rõ ràng tên lớp đầy đủ.

1

Nếu bạn thực sự muốn hoặc cần phải sử dụng tên lớp giống nhau từ hai gói khác nhau, bạn có hai lựa chọn:

1-chọn một để sử dụng trong việc nhập khẩu và sử dụng tên lớp đầy đủ của người kia:

import my.own.Date; 

class Test{ 

    public static void main(String[] args){ 

     // I want to choose my.own.Date here. How? 
     //Answer: 
     Date ownDate = new Date(); 

     // I want to choose util.Date here. How ? 
     //Answer: 
     java.util.Date utilDate = new java.util.Date(); 

    } 
} 


2-luôn luôn sử dụng tên lớp đầy đủ:

//no Date import 
class Test{ 

    public static void main(String[] args){ 

    // I want to choose my.own.Date here. How? 
    //Answer: 
    my.own.Date ownDate = new my.own.Date(); 
    // I want to choose util.Date here. How ? 
    //Answer: 
    java.util.Date utilDate = new java.util.Date(); 

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