2013-07-29 25 views
6

Tôi mới đây (4 ngày trước) bắt đầu lập trình trong JAVA. Tôi có một số kinh nghiệm lập trình tổng thể từ C++ và PHP. Câu hỏi của tôi là: chúng ta có thể thực hiện một hàm trong JAVA, có sẵn trong tất cả các lớp không? Tôi đang nghĩ về một số chức năng ghi nhật ký toàn cầu, mà tôi cần phải gọi ở một vài nơi (sự kiện đăng nhập, lỗi, v.v.). Hãy tưởng tượng tôi có hai lớp, A và B. Tôi cần gọi chức năng ghi nhật ký trong cả hai, nhưng tôi không muốn sao chép toàn bộ nội dung chức năng (điều khủng khiếp mà tôi tin), và tôi muốn gọi nó là nghiêm ngặt (mà không tạo một lớp khác, khởi tạo nó, và sau đó gọi từ ví dụ), như logEvent(someVariable). Vì vậy, tôi nên sử dụng một lớp trừu tượng C, mà A và B sẽ mở rộng, NHƯNG họ đã là một phần mở rộng của lớp khác (được xây dựng trong). Kể từ khi thừa kế nhiều không được phép (là nó?), Tôi cần phải làm một số trick. Singleton cũng không làm tôi hài lòng. Trong PHP hoặc C++ tôi sẽ chỉ tạo ra tập tin riêng biệt với cơ thể chức năng và sau đó bao gồm nó.Chức năng Java (phương pháp) có sẵn ở khắp mọi nơi (toàn cầu)

Dưới đây là cách tôi muốn sử dụng nó:

public class A extends SomeClass { 
    String error = "Error from class A"; 
    logEvent(error); 
} 

public class B extends SomeOtherClass { 
    String error = "Error from class B"; 
    logEvent(error); 
} 
+0

Bạn có thể đọc về cái ác 'Singleton' mẫu. –

+3

@LeeMeador "ác" là vấn đề quan điểm. – hexafraction

Trả lời

26

Đặt một phương pháp tĩnh trong bất kỳ lớp (nó có thể là một lớp utils, hoặc bất cứ điều gì), sau đó gọi nó như thế này: ClassName.functionName()

Các phương thức tĩnh thuộc về lớp, không phải là các cá thể của lớp, do đó bạn không cần phải khởi tạo lớp để truy cập phương thức

Nhưng mọi thứ trong Java phải nằm trong một lớp, vì vậy bạn không thể truy cập tên lớp.

+1

Bạn cũng có thể có một phương thức tĩnh trả về cá thể được cho phép của lớp nếu bạn không thích các phương thức tĩnh. Làm cho hàm tạo của lớp riêng tư và giữ một cá thể trong một trường tĩnh. –

+4

Bạn cũng có thể sử dụng tính năng nhập tĩnh để có thể sử dụng phương thức tĩnh mà không đủ điều kiện với tên lớp tại mỗi trang sử dụng. – DaoWen

+0

@DaoWen điểm tốt, tôi quên mất tính năng đó của Java. Để biết thêm thông tin: http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html Nhưng hãy nhớ rằng nhập khẩu tĩnh có phần hơi cau mày, chúng có thể dễ dàng bị lạm dụng. Tôi không nghĩ rằng phải gõ tên lớp mỗi lần là rất nhiều của một vấn đề lớn, và nó giữ mã sạch sẽ. –

0

Bạn có thể sử dụng phương pháp tĩnh.

Xác định một lớp học với một phương pháp tĩnh:

public class Util{ 
    public static void logEvent(String error){ 
     ... 
    } 
} 

Sau đó, bạn có thể sử dụng metod tĩnh như theo cách này:

public class A extends SomeClass { 
    String error = "Error from class A"; 
    Util.logEvent(error); 
} 

bạn có thể có một cái nhìn vào đây để tìm hiểu thêm về phương pháp tĩnh, http://www.leepoint.net/notes-java/flow/methods/50static-methods.html

+0

Tôi biết về phương pháp tĩnh, nhưng tôi muốn tránh viết tên lớp mọi lúc tôi sử dụng chúng (sau 20 hoặc 50 cuộc gọi nó có thể bực bội :)). Nhưng tôi có thể nhập tĩnh như @DaoWen đã nêu ở trên. – Mars

6

Bạn nên sử dụng phương pháp tĩnh:

package xxx; 

public class Util{ 
    public static void logEvent(String error){ 
    ... 
    } 
} 

và nhập tĩnh:

import static xxx.Util.*; 

public class A extends SomeClass { 
    String error = "Error from class A"; 
    logEvent(error); 
} 
+0

Cảm ơn, đây chỉ là những gì tôi đang tìm kiếm! Chưa từng thấy "nhập tĩnh" trước đây. – BadCash

+0

Tôi đồng ý làm việc cho tôi. Cảm ơn nhiều – hershkoy

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