2014-01-06 2 views
-1

클래스 개체를 사용하여 함수간에 데이터를 전달할 수 있습니다. 클래스가있는 것처럼함수 호출간에 데이터를 전달하는 방법

public class AddsBean 
    { 
     public long addId{get;set;} 
     public int bid { get; set; } 
     public long pointsAlloted { get; set; } 
     public string userId { get; set; } 
     public enum isApproved { YES, NO }; 
     public DateTime approveDate { get; set; } 
     public string title { get; set; } 
     public string description { get; set; } 
     public string Link { get; set; } 
     public DateTime dateAdded { get; set; } 
    } 

우리는 public List<AddsBean> getAdds(string Id)과 같은 함수를 호출 할 수 있습니다. 이 접근법은 클래스의 모든 변수가 필요할 때 유용합니다. 그러나 2 ~ 3 개의 변수 만 있으면됩니까?

메모리의 낭비이기 때문에 클래스의 전달 대상이 좋지 않습니다. 또 다른 가능한 해결책은보다 적은 변수의 다른 클래스를 만드는 것이지만 이것은 실용적이지 않습니다.

성능에 따라 동기를 부여하고 최선을 다하는 최선의 해결책은 무엇입니까?

+0

귀하의 전제가 정확하지 않습니다. 더 많은 메모리가 사용되지 않습니다. 글쎄, 한 장의 여분의 참조를 제외하면. –

+0

@AndrewBarber - 스택이 호출자에게 롤백되면 다시 제거 될 스택에 대한 추가 참조입니다. :) – TheLostMind

+0

사람들은 종종 소프트웨어의 성능에 대해 생각합니다.나는 이런 종류의 문제 (그것의 문제가 아니라)가 당신의 소프트웨어의 성능을 손상시킬 것이라고 생각하지 않는다. 이 상황에서 그것은 당신의 기억을 결코 낭비하지 않습니다. 클래스에 100 개의 필드가 있더라도 객체를 읽거나 복제하는 것을 걱정하지 마십시오. 우리는 기억이 아주 싸는 세상에서 살고 있습니다. 내 손목 시계에도 128 K의 memmory가 있습니다. –

답변

1

Java에서 - "객체 참조가 값으로 전달됩니다."그래서 전체 객체를 전달하지 않으면 객체에 대한 참조를 호출 된 함수에 전달합니다.

EG : 모든

class A{ 
int i; 
int j; 
double k; 
} 

class B{ 
public static void someFunc(A a) // here 'a' is a reference to an object, we dont pass the object. 
{ 
// some code 
} 
public static void main(String[] args){ 
A a = new A(); 
B.someFunc(a); // reference is being passed by value 
} 
} 
+2

C#과 동일 ... –

1

첫째, 자바는 입력 값과 참조로 패스 한, 메모리 소모에 대해 걱정할 필요가 없습니다.
다음에 언급했듯이 모든 개체가 필요하지 않으면 모든 개체를 전달하는 것이 좋지 않은 경우도 있습니다. 어떤 경우에는 사실입니다. 당신이 단위를 직접 제어 할 수있는 다른 클래스를 참조하여

class A 
{id, name} 
class B extends A 
{password,birthday} 

를, 데이터의 서로 다른 범위와 다른 클라이언트를 제공합니다 : 당신이 인스턴스에서 데이터를 보호하기 위해 필요로하는, 그래서 당신은 예를 들어 클래스의 서로 다른 단위를 사용할 수 있습니다 .

그러나 어떤 상황에서는 인스턴스를 사용하여 configure data (hadoop) 또는 일부 다른 구성 관련 인스턴스와 같은 전체 데이터를 모든 응용 프로그램에 저장해야합니다.

가장 적합한 범위를 선택하십시오!

+0

이렇게하면 문제가 악화됩니다. 마리아는 그렇지만 여전히 그렇다. 이미 데이터가있는 객체가 있습니다. 그냥 사용해라. –

+0

@AndrewBarber 동의합니다. 그러나 질문 작성자가 언급 한 이후로, 방금 방법을 제공합니다! – Rugal

+0

그는 이미이를 언급하고 실용적이지 않다고 말했다. –

1

문제의 원인이 확실하고 속성의 하위 집합으로 새 클래스를 정의하지 않으려는 경우 .NET에서는 Tuple 클래스를 사용하여 소수의 관련 필드를 그룹화합니다. 예를 들어, Tuple<int, int, string>은 두 개의 정수와 문자열을이 순서로 포함합니다.

public Tuple<string, long, DateTime> GetPointsData() 
{ 
    AddsBean bean = ... // Get your AddsBean somehow 
    return Tuple.Create<string, long, DateTime>(bean.userId, bean.pointsAlloted, bean.approveDate); 
} 

이 방법이 범위를 벗어나되면

은 더 이상 거기에 언급 된 객체 bean에 라이브 참조없고 미래의 어떤 시점에서 가비지 컬렉터에 의해 수집됩니다.

그렇다면 AddsBean 클래스의 인스턴스가 앱의 성능에 부정적인 영향을 미치지 않는다면 걱정할 필요가 없습니다. 응용 프로그램의 성능은 다른 작업에 의해 훨씬 더 많이 영향을받습니다. 참조 유형 (struct 대신 class으로 정의 된 유형)을 반환하면 객체 자체에 대한 참조가 아닌 객체에 대한 참조 만 전달됩니다.

+0

기술적으로는 기본적으로 다른 속성을 사용하는 것과 같습니다. –

+0

사실이지만 C#에는 메서드에서 여러 값을 반환하는 데 사용할 수있는 여러 가지 옵션이 없습니다. –

+0

@StephenJennings 당신이 말한 바는 정확하지만, 클래스의 객체를 만들 때 할당 된 속성에 대한 메모리를 알고 모든 소수의 속성에서 메모리가 필요하다는 것은 의심 스럽습니다. –

관련 문제