2010-01-28 10 views
8

यहाँ कोड का एक टुकड़ा है:क्या जावा में एक कॉन्स संदर्भ समतुल्य है?

//Game board is made up of Squares. A player can place GamePieces on a Square. 
    public class CheckersBoard 
    { 
     public boolean PlaceGamePiece(GamePiece gamePiece, int nRow, int nColumn) { 
      return m_theGameBoard[nRow][nColumn].PlaceGamePiece(gamePiece); 
     } 

     private Square[][] m_theGameBoard; 
    } 

Let कहते हैं कि मैं PlaceGamePiece विधि का परीक्षण कर रहा हूँ (JUnit का प्रयोग करके) और मैं m_theGameBoard तक पहुँचने के लिए तो मैं इस पर गौर करें और सत्यापित करें GamePiece सही पर रखा गया था कर सकते हैं की जरूरत है स्क्वायर और सही डेटा है।

C++ में मैं या तो एक दोस्त तो यह निजी सदस्य m_theGameBoard पहुँच सकते हैं चाहते हैं परीक्षण वर्ग, या मैं एक समारोह है कि एक स्थिरांक gameboard कि बदला नहीं जा सकता रिटर्न होगा (क्योंकि यह स्थिरांक है):

const GameBoard& GetGameBoard() const { return m_theGameBoard; } 

अब मैं जो भी जांच कर रहा हूं वह खेल बोर्ड पर करना चाहता हूं, लेकिन मैं खेल बोर्ड को संशोधित नहीं कर सकता क्योंकि यह स्थिर है।

जावा रिटर्निंग कॉन्स संदर्भ या मित्र वर्गों का समर्थन नहीं करता है। तो मेरा सवाल यह है कि ऐसा करने का मानक जावा तरीका क्या है ?? क्या मुझे केवल एक्सेसर्स प्राप्त करने का एक गुच्छा प्रदान करना है जो मुझे Square पर डेटा की जांच करने की अनुमति देता है?

अद्यतन: मैंने कैलेब ब्रसे के सुझाव के रूप में गेटपीस विधि लिखना समाप्त कर दिया।

public GamePiece GetGamePiece(Point pt) { 
    return new GamePiece(m_theGameBoard[pt.GetRow()][pt.GetColumn()]); 
} 

नोटिस मैं एक नया गेमपीस ऑब्जेक्ट बनाता हूं और उसे वापस करता हूं। मैं GameBoards आंतरिक संदर्भ वापस नहीं कर रहा हूं, इसलिए कोई भी गेमबोर्ड को संशोधित नहीं कर सकता क्योंकि उनके पास केवल एक प्रति है! अच्छा! मदद लोगों के लिए धन्यवाद, कुछ वाकई अच्छी सलाह है।

एफवाईआई: जब मैं उन्हें यहां पोस्ट करता हूं तो मैं ऑब्जेक्ट्स के नाम बदलता रहता हूं, क्षमा करें अगर वह किसी को भ्रमित कर देता है।

उत्तर

3

चर को protected के रूप में परिभाषित करें, ताकि यदि यूनिट परीक्षण उसी पैकेज में है, तो यह इसका उपयोग कर सकता है।

हालांकि, मैं बस एक सार्वजनिक विधि getPiece(int row, int col) जोड़ूंगा जो उस वर्ग पर टुकड़ा लौटाता है (या वहां कोई टुकड़ा नहीं है तो शून्य)। ऐसा लगता है कि आपको वैसे भी एक विधि की आवश्यकता होगी, और आप इसे अपने परीक्षणों में उपयोग कर सकते हैं।

+0

मैं इस धारणा के तहत हूं कि संरक्षित सी के दोस्त जैसा ही है। – Karl

+0

लेकिन यदि बोर्ड के साथ काम करने वाली कक्षा बोर्ड पर सभी टुकड़ों को प्रदर्शित करने की आवश्यकता है (जैसे कि एक जीयूआई कक्षा जिसे बोर्ड पर सभी टुकड़े प्रदर्शित करने की आवश्यकता होती है) - आप टुकड़े पाने के तरीके के बिना इसके बारे में कैसे जाएंगे? मेरे शतरंज ऐप में मेरे पास 'बोर्ड.pieceOn (स्क्वायर)' विधि है जो किसी टुकड़ा को मौजूद करती है, यदि कोई टुकड़ा मौजूद है, या स्क्वायर खाली है तो शून्य। टुकड़े टुकड़े करने वाले कब्जे वाले स्क्वायर का नक्शा वापस लौटाना बेहतर होगा? –

+0

http://www.javaworld.com/javaworld/jw-01-2004/jw-0102-toolbox.html ग्राफिक्स संदर्भ दिए गए ऑब्जेक्ट्स क्यों नहीं हैं, स्वयं को आकर्षित करें? टुकड़ों में एक 'ड्रा' विधि जोड़ें (या प्रत्येक टुकड़े का सबक्लास, यदि आप यूआई कोड को अलग रखना पसंद करते हैं)। मुझे लगता है कि 'board.draw (ग्राफिक्स)' और 'piece.draw (ग्राफिक्स) 'सही समझ में आता है। इसे लिंक में उल्लिखित होल्ब की तकनीक के साथ संयोजित करें और आपके पास एक अच्छा समाधान है जो ब्रेकिंग इंकैप्यूलेशन से बचाता है। –

1

हां। आपके विकल्प मूल रूप से या तो होने के लिए नीचे उबाल:

Square getSquareAtLocation(int row, int col) { ... }; 

या जावा संग्रह में से एक का उपयोग कर जो आप तो Collections.unmodifiableList (...)

के माध्यम से पारित कर सकता है (ध्यान दें कि अगर आप एक बहुआयामी सूची का इस्तेमाल किया , आपको आंतरिक सूचियों को लपेटने के लिए सावधान रहना होगा ताकि यह सुनिश्चित किया जा सके कि वे संशोधित नहीं हैं)

यदि यह केवल परीक्षण के लिए उपयोग किया जा रहा है, तो आप एक ऐसा फ़ंक्शन भी बना सकते हैं जो एक रिटर्न देता है सरणी की गहरी प्रति।

2

किसी विधि या संपत्ति के लिए डिफ़ॉल्ट एक्सेस संशोधक "पैकेज-संरक्षित" है, जिसका अर्थ है "केवल मेरे पैकेज में दिखाई देता है"। इसलिए, आप "दोस्ती" के अर्थशास्त्र का अनुकरण कर सकते हैं, परीक्षण के लिए एक अलग कोड बेस बनाए रखते हुए, दो अलग-अलग स्रोत फ़ोल्डरों के साथ, लेकिन उसी पैकेज संरचना के साथ।

src 
|--com 
    | 
    --cchampion 
     | 
     --MyClass.java 
tests 
|--com 
    | 
    --cchampion 
     | 
     --TestMyClass.java 

फिर, MyClass के भीतर।जावा

public class MyClass { 
    private int nonTestedThing; 
    int[][] testedThing; // this is visible to TestMyClass 
    // or 
    // protected int[][] testedThing; 
    // if you want it visible to kids 
} 

यह किसी भी सम्मान में आदर्श नहीं है, लेकिन इसके बारे में जाने का यह एक तरीका है।

संबंधित मुद्दे