2013-04-09 36 views
6

Tôi có một lớp với một loạt các trường, tất cả đều riêng tư (các lớp con truy cập một vài trường với các getters được bảo vệ). Tôi cần phải chuyển hầu hết các trường đó vào một phương thức trong lớp khác sẽ định dạng chúng và tạo ra kết quả đầu ra. Có ok để có một phương thức trong lớp với các trường sẽ vượt qua tất cả chúng? Hay những hoàn cảnh này gợi ý rằng tôi nên thực hiện một số mối quan hệ khác giữa hai lớp, vì chúng dường như kết hợp chặt chẽ vì điều này?Java - Có ok để có phương thức chuyển các giá trị trường riêng vào phương thức của lớp khác không?

Thông tin khác: lớp A thể hiện Nhân viên, trách nhiệm duy nhất của lớp B là định dạng đầu ra của chương trình.

+0

Bạn có cần tách riêng định dạng của đầu ra khỏi 'Employee' không? Nếu vậy tôi sẽ đề nghị sử dụng 'ResourceBundle' để thực hiện định dạng và giữ phương thức trong lớp' Employee'. –

+0

Cảm ơn, lần đầu tiên tôi nghe nói về một ResourceBundle (tôi mới đến đây) và tìm kiếm nó ngay bây giờ. –

Trả lời

6

Bạn có hỏi liệu có thể làm như sau không?

public class A { 
private B myB = new B(); 
private String myUnformattedName = "some information"; 

public String getFormattedInfo() { 
    return myB.formatInfo(myUnformattedName); 
} 
} 

Điều đó hoàn toàn OK.

Marking a field as private just means that only the containing class should be able to access it...

Nếu bạn có nghĩa là cái gì khác đó là tốt nhất để bật một số mã trong câu hỏi của bạn để cung cấp cho người bối cảnh


OK, vì vậy không có cách nào để thiết lập các giá trị ở đây nhưng bạn có thể nhìn thấy ở đây có hai cách khác nhau để gọi trình định dạng. Khi danh sách tham số vượt qua ba hoặc bốn mục thì sẽ rất khó đọc.

Trong trường hợp này, tôi chỉ chuyển A vào trình định dạng và có phương thức nhận cho mỗi giá trị bạn muốn B có thể đọc.

public class A { 
private B myB = new B(); 
private String myUnformattedName = "some information"; 
private String myUnformattedNameOne = "some information"; 
private String myUnformattedNameTwo = "some information"; 
private String myUnformattedNameThree = "some information"; 
private String myUnformattedNameFour = "some information"; 
private String myUnformattedNameFive = "some information"; 
private String myUnformattedNameSix = "some information"; 

public String getFormattedInfo() { 
    //pass the object itself and use get methods 
    return myB.formatInfo(this); 
} 

public String getFormattedInfoLong() { 
    //this is OK but gets difficult to read the longer the 
    //parameter list gets 
    return myB.formatInfo(myUnformattedName, myUnformattedNameOne, 
     myUnformattedTwo, myUnformattedNameThree, myUnformattedNameFour, 
     myUnformattedNameFive, myUnformattedNameSix); 
} 

//getters 
public String getUnformattedName() { 
    return myUnformattedName; 
} 

public String getUnformattedNameOne() { 
    return myUnformattedNameOne; 
} 

//etc 

} 
+0

Vâng, có vẻ như nó! Cảm ơn bạn. –

+0

hm, thực sự là nó ok để vượt qua rất nhiều lĩnh vực (dây và tăng gấp đôi) đối tượng B như các tham số cùng một lúc thông qua phương thức getFormattedInfo()? –

+0

Vâng, nó chỉ trở thành một điều phong cách sau đó ... nếu danh sách tham số được "quá dài" sau đó cung cấp cho các lĩnh vực getters và vượt qua các đối tượng chính nó. –

1

OK khi lớp B không sửa đổi chúng. Nếu lớp học làm, vượt qua các trường hợp bất biến với nó.

2

Tôi nghĩ hoàn toàn tốt đẹp khi vượt qua chúng, miễn là chúng có kiểu nguyên thủy hoặc không thay đổi.

Nếu callee có thể sửa đổi chúng khi không được yêu cầu, thì bạn có vấn đề về thiết kế.

+0

Tuyệt vời, cảm ơn! Họ là một trong hai dây hoặc đôi và họ không nên sửa đổi. Bởi 'bất biến' tôi đoán nó ok nếu các trường chuỗi là tư nhân/có phương pháp thiết lập chỉ nhìn thấy từ lớp gốc + lớp con? –

+0

Các lớp không thể thay đổi không thể thay đổi khi chúng được tạo. Vì vậy, tất cả mọi thứ được thực hiện trong constructor, không có mutators (setters), chỉ getters. Và thậm chí getters sản xuất bản sao phòng thủ của dữ liệu mà họ quay trở lại nếu cần thiết. Các lớp Java như String tuân theo điều này. –

1

Bạn có thể đặt Lớp B thành lớp tiện ích và chỉ có các phương thức tĩnh trên đó.

Sau đó, bên trong lớp của bạn Một bạn có thể có sth như:

formatMyVariables public String() {

trở B.format (a, b, c, d);

}

Tôi giả sử đầu ra bạn đã đề cập là một chuỗi nhưng nó có thể là bất kỳ thứ gì thực sự.

1

Bạn nên cân nhắc rằng nếu Employee lĩnh vực của bạn là những giá trị nguyên thủy (int, boolean) hoặc những người bất biến (như String chẳng hạn), sau đó bạn có thể cho các lớp khác đọc chúng mà không lo lắng.

Bảo vệ các trường bằng private là cách không để lộ hoạt động bên trong của đối tượng của bạn, chỉ có thể truy cập được thông qua API public. Tuy nhiên, khi lớp của bạn thực sự đại diện cho một đối tượng kinh doanh (tức là một nhóm các giá trị xác định một thực thể) thì nó hoàn toàn an toàn để cho người khác đọc các trường nội bộ.

-1

cách tốt nhất để chuyển dữ liệu là các đối tượng DTO.

các đối tượng này chỉ chứa các biến mẫu (với bộ định vị và getters) làm dữ liệu bạn muốn chuyển!

không nên có những hành vi trong lớp này

ví dụ nếu bạn muốn vượt qua một dữ liệu nhân viên, làm như sau

class EmployeeBean 
{ 
private String name; 
private String age; 

public void setName(String n) 
{ 
name=n; 
} 

public String getName() 
{ 
return name; 
} 


public void setAge(int n) 
{ 
age=n; 
} 

public int getAge() 
{ 
return age; 
} 

} 

bây giờ bạn có thể tạo lớp EmployeeBean, cư dữ liệu trong trường hợp của mình biến và sau đó vượt qua đối tượng này làm tham số cho phương thức trong lớp khác, nơi nó có thể được định dạng

4

Tôi thực sự sẽ đề xuất mẫu Khách truy cập.

Class A có một phương pháp mà chấp nhận một người truy cập, do đó có một phương pháp nào cũng xác định, ví dụ như thế này:

Thứ nhất, lớp đến thăm cho phép một số lớp với giao diện được xác định rõ trong, không vượt qua đó là dữ liệu của riêng bên ngoài.

public class A { 
    int data; 

    public void getFormattedBy(Formatter f) { 
     f.format(data); 
    } 
} 

Giao diện của khách truy cập, cho phép nhiều và định dạng

public interface Formatter { 
    void format (int data); 
} 

Một định dạng, được phép vào lớp truy cập.

public class B implements Formatter { 
    public void format(int data) { 
     // do the formatting and printing 
    } 
} 

Bằng cách này bạn chỉ cần gọi

A a = new A(); 
B b = new B(); // the formatter 
a.getFormattedBy(b); 

Cuối cùng, một người truy cập (formatter) có thể truy cập nhiều lớp cho phép cho phép người truy cập trong (có lẽ bằng cách thực hiện một giao diện riêng của họ), và có thể được một số khách viếng thăm viếng thăm.

+0

Điều này thật thú vị và trông giống như một giải pháp tốt. Cảm ơn! –

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