2012-06-13 30 views
9

Tôi biết giao diện điểm đánh dấu trong java. Nó được sử dụng để xác định một hành vi cụ thể về một lớp. Ví dụ, giao diện Serializable có khả năng cụ thể để lưu trữ một đối tượng vào dòng byte và quá trình ngược lại của nó. Nhưng tôi không biết nơi hành vi cụ thể này được thực hiện, bởi vì nó không có bất kỳ phương pháp nào trong đó.Làm thế nào để viết giao diện điểm đánh dấu của riêng chúng ta trong Java?

  1. Cách JVM gọi hành vi cụ thể này?
  2. Làm cách nào để viết giao diện điểm đánh dấu của riêng mình? Bạn có thể cho tôi một giao diện điểm đánh dấu được xác định bởi người dùng đơn giản cho sự hiểu biết của tôi không?
  3. Có thể có phương pháp trong giao diện điểm đánh dấu không?

Vui lòng hướng dẫn tôi giải quyết vấn đề này.

+0

Tại sao bạn muốn viết giao diện điểm đánh dấu? Đó là loại điều lỗi thời. Sử dụng _annotations _.... dù sao bạn sẽ sử dụng giao diện điểm đánh dấu của riêng bạn –

+0

@Op De Cirkel - Giao diện điểm đánh dấu đầu tiên và quan trọng nhất của nó xác định một kiểu được thực hiện bởi các cá thể của lớp được đánh dấu; chú thích đánh dấu không. Đọc Hiệu quả phiên bản thứ 2 của Mục thứ 2 để biết thêm chi tiết. – Premraj

Trả lời

11
  1. serialization được xử lý bởi ObjectInputStreamObjectOutputStream lớp. Nếu một lớp có các yêu cầu tuần tự đặc biệt, thì các phương thức tạo ra được nêu trong API. Phản ánh được sử dụng để gọi các phương thức này.

  2. Giống như cách bạn viết bất kỳ giao diện nào khác.

  3. Không có gì ngăn bạn đặt phương thức trong giao diện điểm đánh dấu.

Thực tiễn phổ biến hơn bây giờ là sử dụng annotations để cung cấp cùng giao diện điểm đánh dấu siêu dữ liệu cung cấp.

+0

: cảm ơn bạn rất nhiều ...tôi muốn biết nơi họ đang viết mã cho lớp ObjectInputStream liên quan ...? sau đó chỉ có tôi có thể viết giao diện đánh dấu của riêng tôi như serilizable ... – Saravanan

+0

Đi qua nguồn của các lớp được đề cập thay vì hỏi chính xác dòng !! – Premraj

+3

@Saravanan JDK là mã nguồn mở. ['ObjectInputStream'] (http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectInputStream.java/?v=source). ['ObjectOutputStream'] (http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectOutputStream.java/?v=source). – Jeffrey

0

Theo như tôi biết, các giao diện điểm đánh dấu nhận được hành vi của chúng theo các lớp "tiện ích". Ví dụ: nếu bạn đã đọc cuốn sách Patterns Patterns bởi Gang of Four, bạn có hành vi của một lớp được gắn thẻ với một giao diện đánh dấu được định nghĩa trong một lớp khác.

Ví dụ: bạn có giao diện điểm đánh dấu "Có thể chia sẻ". Bạn có một quá trình đi qua tất cả các lớp thực hiện giao diện này (thông qua sự phản chiếu) và sau đó thực hiện lưu hoạt động trên nó.

2

Như được giải thích rất độc đáo trong bài viết trên trang Marker interface pattern, một giao diện điểm đánh dấu là một dạng siêu dữ liệu. Mã máy khách có thể kiểm tra xem một đối tượng có phải là một thể hiện của giao diện điểm đánh dấu và điều chỉnh hành vi của nó (của khách hàng) cho phù hợp hay không. Dưới đây là một giao diện đánh dấu:

public interface CoolObject { 
} 

Sau đó, mã này có thể kiểm tra xem một đối tượng là một CoolObject và làm điều gì đó với nó:

if (anObject instanceof CoolObject) { 
    addToCoolList((CoolObject) anObject); 
} 

Giao diện Serializable được định nghĩa như là một phần của ngôn ngữ Java. Bạn không thể thực hiện hành vi ở cấp đó.

Bạn có thể thêm phương thức vào giao diện điểm đánh dấu, nhưng kết hợp mẫu đánh dấu với các sử dụng khái niệm khác cho giao diện và có thể gây nhầm lẫn. (Là một lớp thực hiện giao diện cho mục đích đánh dấu nó, hoặc cho hành vi của nó, hoặc cả hai?)

Như đã giải thích trong bài viết trên Wikipedia, giao diện đánh dấu trong Java có thể (và có lẽ nên) được thay thế bằng annotations.

17
  • Làm thế nào JVM gọi hành vi cụ thể này

ObjectOutputStreamObjectInputStream sẽ kiểm tra lớp học của bạn hay không implementes Serializable, Externalizable. Nếu có, nó sẽ tiếp tục hoặc nếu không sẽ bị ném NonSerializableException.

  • Làm thế nào để viết giao diện đánh dấu riêng của chúng tôi

Tạo một giao diện mà không phương pháp nào và đó là giao diện đánh dấu của bạn.

mẫu

public interface IMarkerEntity { 


} 

Nếu bất kỳ lớp mà thực hiện giao diện này sẽ được thực hiện như đối tượng cơ sở dữ liệu của ứng dụng của bạn.

Sample Code:

public boolean save(Object object) throws InvalidEntityException { 
    if(!(object instanceof IMarkerEntity)) { 
     throw new InvalidEntityException("Invalid Entity Found, cannot proceed); 
    } 
    database.save(object); 
} 
  • Đây có phải là có thể có phương pháp trong giao diện đánh dấu?

Toàn bộ ý tưởng của Marker Interface Pattern là cung cấp ý nghĩa để nói "có tôi là gì đó" và sau đó hệ thống sẽ tiến hành quy trình mặc định, như khi bạn đánh dấu lớp của mình là Serialzable. được chuyển đổi thành byte.

+3

Điều này phải trả lời câu hỏi –

2

Có Chúng ta có thể tạo riêng Marker interface..See của chúng tôi sau một ...

interface Marker{ 
} 

class MyException extends Exception { 
    public MyException(String s){ 
     super(s); 
    } 
} 

class A { 
    void m1() throws MyException{   
     if((this instanceof Marker)){ 
      System.out.println("successfull"); 
     } 
     else { 
      throw new MyException("Must implement interface Marker "); 
     }  
    } 
} 

public class CustomMarkerInterfaceExample extends A implements Marker 
{ // if this class will not implement Marker, throw exception 
    public static void main(String[] args) { 
     CustomMarkerInterfaceExample a= new CustomMarkerInterfaceExample(); 
     try { 
      a.m1(); 
     } catch (MyException e) { 

      System.out.println(e); 
     } 


    } 

} 
0

giao diện Marker không có phương pháp. Java có giao diện điểm đánh dấu được tích hợp sẵn như Serializable, Clonable & EventListner v.v. được JVM hiểu.

Chúng tôi có thể tạo giao diện điểm đánh dấu riêng, nhưng không liên quan gì đến JVM, chúng tôi có thể thêm một số séc với instanceOf.

  1. Tạo giao diện trống

    interface Marker{ } 
    
  2. Viết một lớp và thực hiện các giao diện

    class A implements Marker { 
        //do some task 
    } 
    
  3. Main lớp để kiểm tra giao diện đánh dấu instanceof

    class Main { 
        public static void main(String[] args) { 
         A ob = new A()[ 
         if (ob instanceOf Marker) { 
          // do some task 
         } 
        } 
    } 
    
+1

Bạn có thể muốn chú ý hơn, khi bạn viết mã, bởi vì mã của bạn cho điểm 3 có một số sai lầm. – Tom

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