2012-07-18 33 views
5

Dưới đây là một ví dụ:Java: Làm thế nào để hạn chế quyền truy cập của một phương thức vào một lớp cụ thể?

class A 
{ 
    List l = new List(); 
    list.insert("x"); 
} 

class List 
{ 
    ... 
    public void insert() 
    { 
     /*insertion occurs*/ 
    } 
    ... 
} 

Có thể ở tất cả để giữ insert() phương pháp nào, nhưng truy cập giới hạn chỉ cho lớp A sao cho không có lớp học khác có thể truy cập vào nó, chỉ khi gọi từ A?

+5

Bạn có thể đặt 'List' thành lớp bên trong trong' A', vì vậy không có lớp nào khác có quyền truy cập vào nó.Cách khác có thể đặt 'Chèn danh sách # (A a)' –

Trả lời

0

Thêm một gói đến lớp học của bạn và tuyên bố phương pháp riêng

package com.my.stuff; 

class A 
{ 
    List l = new List(); 
    list.insert("x"); 

    class List 
    { 
     ... 
     protected void insert() 
     { 
     /*insertion occurs*/ 
     } 
     ... 
    } 
} 

Xin lỗi tôi nghĩ rằng bạn cần phải "bảo vệ" nếu một lớp con ... tốt nhất là làm cho nó một lớp bên trong và sử dụng bảo vệ tôi tin.

Xem bài viết này cho phạm vi: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

+0

Bạn có thể sử dụng chế độ hiển thị gói * được bảo vệ * hoặc * mặc định * (do không khai báo mức hiển thị) để giới hạn quyền truy cập vào tất cả các lớp trong cùng một gói. Sự khác biệt giữa khả năng hiển thị được bảo vệ và mặc định được bảo vệ cho phép truy cập cho các lớp con. –

0

Điều tốt nhất bạn có thể làm bằng bộ sửa đổi truy cập là làm cho gói phương pháp tư nhân (loại bỏ các từ khóa public) và giữ chỉ hai lớp trong cùng một gói.

4

Nếu phương thức công khai, mọi người đều có thể truy cập. Bí quyết để kiểm soát quyền truy cập giống như của bạn là phơi bày một tập hợp các hoạt động công khai thông qua giao diện, thêm các hoạt động phụ vào một lớp riêng tư triển khai giao diện và làm cho chương trình người dùng của bạn chuyển sang giao diện chứ không phải lớp.

Dưới đây là một ví dụ:

public interface MyList { 
    Object elementAt(int i); 
} 
public class A { 
    private static class MyListImpl implements MyList { 
     public Object elementAt(int i) { 
      ... 
     } 
     public void insert(Object element) { 
      ... 
     } 
    } 
    private final MyListImpl list = new MyListImpl(); 
    public MyList getList() { return list; } 
    public void insert(Object o) { list.insert(o); } 
} 

kịch bản sử dụng:

A a = new A(); 
a.insert(123); 
a.insert("quick brown fox"); 
MyList lst = a.getList(); 
System.out.println(lst.elementAt(0)); 
System.out.println(lst.elementAt(1)); 
+0

Đây là mã C# ... – unwichtich

+1

@unwichtich Cảm ơn, tôi nghĩ rằng tôi đã sửa C# -isms trong mã Java. – dasblinkenlight

0

Đặt nó như lớp bên trong A hoặc bạn có thể làm điều khác ... Hãy chèn mất một tham số với loại của Object và ở đầu nó kiểm tra xem kiểu của tham số là A .... và khi bạn gọi nó gửi đối tượng gọi ... maby nó không phải là một ý tưởng tốt nhưng nó sẽ làm những gì bạn muốn

0

Nếu tất cả nội dung "lớp bên trong" trong các câu trả lời trước gây nhầm lẫn cho bạn, có một cách khác có thể trực quan hơn (giả sử bạn đã học về từ khóa và kế thừa extends). Bạn chỉ cần thực hiện phương thức insert()protected thay vì public và thực hiện class A mở rộng List. Ví dụ:

public class List { 
    ... 
    protected void insert() { 
     //insertion occurs 
    } 
    ... 
} 

public class A extends List { 
    ... 
} 

Chừng nào không có các lớp khác kéo dài List, chỉ đối tượng có kiểu AList bao giờ sẽ có thể sử dụng phương pháp insert().

+1

Hoặc các lớp học trong cùng một gói. – EJP

0

Đặt nó vào lớp được phép và đặt ở chế độ riêng tư.

1
package problems; 

public class Problem1 { 
    public static void main(String[] args) { 
     B b = new B(); 
     b.methodInB(); 
     C c = new C(); 
     c.methodNotInB(); 
    } 
} 

class A { 
    public void onlyB() { 
     StackTraceElement[] stackTraceElements = Thread.currentThread() 
       .getStackTrace(); 
     if (!problems.B.class.getCanonicalName().equals(
       stackTraceElements[stackTraceElements.length - 2] 
         .getClassName())) { 
      System.err.println("You are not authorized to call me!!"); 
      return; 
     } 
     System.out.println("You are authorized to call me!!"); 
    } 
} 

class B { 
    public void methodInB() { 
     A a = new A(); 
     a.onlyB(); 
    } 
} 

class C { 
    public void methodNotInB() { 
     A a = new A(); 
     a.onlyB(); 
    } 
} 
4

tôi sẽ vượt qua đối tượng đó là cách gọi phương thức như một cuộc tranh cãi, tức là

list.insert("x", this); 

Và sau đó kiểm tra nếu các đối tượng thông qua là một Instance của Class A

public void insert (String x, Object o) 
    { 
     if(o instanceof ClassA){ 
     /*insertion occurs*/ 
     } 
    } 
+1

Chỉ cần một sidenote: điều này sẽ làm việc cho các lớp mở rộng A là tốt ... – home

+1

Đây không phải là giới hạn, tất cả mọi người có thể vượt qua một thể hiện của Object (hoặc bất kỳ lớp học) để phương pháp ... – unwichtich

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