2013-04-09 2 views
6

나는 많은 개인 필드를 가진 클래스를 가지고있다. (서브 클래스는 보호 된 getter로 몇 개만 접근한다.) 그 필드의 대부분을 다른 클래스의 메소드로 전달하여 형식을 지정하고 출력을 생성해야합니다. 클래스 전체에서 전달할 필드가있는 메소드를 사용하는 것이 좋습니까? 또는이 상황 때문에 두 클래스 사이에 다른 관계를 구현해야한다고 제안하는 것입니까?Java - 비공개 필드 값을 다른 클래스의 메서드로 전달하는 메서드를 사용하는 것이 좋습니까?

추가 정보 : 클래스 A는 직원을 나타내며 클래스 B는 프로그램의 출력 형식을 지정합니다.

+0

출력 결과의 형식을 'Employee'에서 분리해야합니까? 그렇다면'ResourceBundle'을 사용하여 서식을 지정하고'Employee' 클래스에 메서드를 유지할 것을 제안합니다. –

+0

고마워, 처음 ResourceBundle에 대해 들어 봤다. –

답변

6

다음 작업을 수행 할 수 있는지 묻는 중입니까?

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

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

괜찮습니다.

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

당신이 다른 것을 의미하는 경우는 상황을 사람들에게


확인을 제공하기 위해 귀하의 질문에 몇 가지 코드를 팝업하는 것이 가장 좋습니다, 그래서 여기에 값을 설정하는 방법은 없습니다하지만 당신은 볼 수 있습니다 여기서 포맷터를 호출하는 두 가지 다른 방법이 있습니다. 매개 변수 목록이 3 ~ 4 개의 항목을 지나면 읽을 수 없게됩니다.

이 예제에서는 A를 포맷터에 전달하고 B가 읽을 수 있도록 각 값에 대한 get 메소드를 갖습니다.

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

네, 그렇게 보입니다! 고맙습니다. –

+0

흠, 실제로는 getFormattedInfo() 메소드를 통해 B 객체에 많은 필드 (문자열과 복식)를 동시에 매개 변수로 전달하는 것이 좋습니다. –

+0

네, 그냥 문체가 된 것입니다 ... 매개 변수 목록이 "너무 길게"되면 getters 필드를주고 객체 자체를 전달하십시오. –

1

클래스 B가 수정하지 않는 한 괜찮습니다. 클래스가하는 경우, 불변의 인스턴스를 그 클래스에 건네줍니다.

2

원시 타입을 가지고 있거나 불변 인 한, 그것들을 전달하는 것이 완벽하다고 생각합니다.

피 호출자가 예상치 못한 상황에서 수정할 수 있으면 디자인 문제가 있습니다.

+0

정말 고마워! 그들은 문자열이나 복식 중 하나이며 수정해서는 안됩니다. '불변'에 의해 문자열 필드가 개인/메서드를 원래 클래스 + 하위 클래스에서만 볼 수 있다면 괜찮습니까? –

+0

변경할 수없는 클래스는 일단 만들어지면 변경할 수 없습니다. 그래서 모든 것은 생성자에서 이루어지며, 뮤터레이터 (setter)는 없으며 getter 만 있습니다. 또한 게터조차도 필요에 따라 반환하는 데이터의 방어 복사본을 생성합니다. String과 같은 Java 클래스는 이에 복종합니다. –

1

클래스 B를 유틸리티 클래스로 만들고 정적 메서드 만 사용할 수 있습니다.() {

반환 B.format (A, B, C, D)

공공 문자열 formatMyVariables;

그런 다음 클래스 A 안에 당신은 같은 STH 수 있습니다

은} 나는 당신이 언급 한 출력 문자열 가정하지만 그것은 정말 아무것도 할 수있다.

1

당신은 당신의 Employee 필드가 기본 값 (int, boolean) 또는 불변의 것들 (같은 String 예를 들어)이 있다면, 당신은 다른 클래스가 걱정없이 읽을 수 있도록 할 수 있음을 고려해야한다.

필드를 private으로 보호하는 것은 개체의 내부 작업을 노출하지 않는 방법이며, 이는 public API를 통해 단독으로 액세스 할 수 있습니다. 그러나 클래스가 실제로 비즈니스 객체 (즉, 엔티티를 식별하는 값 그룹)를 나타낼 때 다른 사람들이 내부 필드를 읽도록하는 것이 안전합니다.

-1

데이터를 전송하는 가장 좋은 방법은 DTO 개체입니다.

이러한 개체는 전송하려는 데이터로 인스턴스 변수 (설정자와 getter 포함) 만 포함합니다!

당신은 이제 EmployeeBean 클래스를 만들고 해당 인스턴스에 데이터를 채울 수 있습니다

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; 
} 

} 

을 다음과 같이하는 직원 데이터를 전달하고 싶은 경우이 클래스 예를 들어

에는 행동이 없어야합니다 변수를 만들고이 객체를 다른 클래스의 메서드에 매개 변수로 전달하여 형식을 지정할 수 있습니다.

4

실제로 방문자 패턴을 제안합니다.

클래스 A 차례로 이와 같은 잘 정의 된 공공 방법이 방문자, 받아들이는 방법이 있습니다

먼저, 방문한 클래스는 잘 정의 된 인터페이스의 일부 클래스를 전달하지 않습니다 수 있습니다 그것은 외부에 대한 자신의 데이터입니다.

public class A { 
    int data; 

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

방문자의 인터페이스는 여러 포매터

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

포맷터

수 있습니다, 그것은 방문 클래스로 허용된다.

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

이 방법 당신은 단순히, 방문자 (포맷터)은 (아마도 자신의 인터페이스를 구현하여)의 방문자 수 있도록 많은 클래스를 방문 할 수 있습니다 결국

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

전화 많은 방문객이 방문한 수업을 방문 할 수 있습니다.

+0

이것은 흥미롭고 좋은 해결책 인 것 같습니다. 감사! –