कोड संकलन नहीं करता है:
Test.java:8: method() in Bar cannot override method() in Foo; overridden method is static final public static void method() {
संदेश भ्रामक है के बाद से एक स्थिर विधि परिभाषा के अनुसार अधिरोहित जा कभी नहीं कर सकते हैं।
मैं जब (नहीं 100% हर समय कोडिंग निम्न कार्य करें, लेकिन कुछ भी यहाँ "गलत" है:
("नियम" का पहला सेट सबसे चीजों के लिए किया जाता है - कुछ विशेष मामलों के बाद कवर कर रहे हैं)
- एक अंतरफलक
- एक अमूर्त वर्ग है कि इंटरफ़ेस को लागू करता है
- ठोस वर्ग कि अमूर्त वर्ग का विस्तार
- concret बनाते बनाते हैं ई वर्गों है कि इंटरफ़ेस को लागू करता है लेकिन,,
- हमेशा अमूर्त वर्ग का विस्तार नहीं करता है, तो संभव बनाने के सभी चर/स्थिरांक/इंटरफ़ेस
के मापदंडों एक अंतरफलक के बाद से स्थिर तरीकों आप हवा नहीं है नहीं हो सकता इस मुद्दे के साथ। यदि आप अमूर्त वर्ग या ठोस कक्षाओं में स्थिर तरीके बनाने जा रहे हैं तो उन्हें निजी होना चाहिए, फिर उन्हें ओवरराइड करने का कोई तरीका नहीं है।
विशेष मामलों:
उपयोगिता वर्गों (वर्गों सभी स्थैतिक तरीकों के साथ):
- के रूप में अंतिम
- वर्ग घोषित यह को रोकने के लिए एक निजी निर्माता देने के आकस्मिक निर्माण
यदि आप एक ठोस या अमूर्त वर्ग में एक स्थिर विधि चाहते हैं जो निजी नहीं है तो आप इसके बजाय इसके बजाय उपयोगिता वर्ग बनाना चाहते हैं।
मूल्य वर्गों (एक वर्ग बहुत विशेष है कि अनिवार्य रूप से डेटा रखने के लिए, java.awt.Point की तरह है, जहां यह काफी रखा है x और y मान):
- एक इंटरफेस बनाने की आवश्यकता
- कोई सार वर्ग बनाने की कोई आवश्यकता नहीं
- कक्षा अंतिम
- गैर-निजी स्थैतिक विधियां ठीक हैं, खासकर निर्माण के लिए क्योंकि आप कैशिंग करना चाहते हैं।
यदि आप उपर्युक्त सलाह का पालन करते हैं तो आप बहुत लचीले कोड के साथ हवादार होंगे जिसमें जिम्मेदारियों का काफी साफ अलगाव भी होगा।
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public final class Location
implements Comparable<Location>
{
// should really use weak references here to help out with garbage collection
private static final Map<Integer, Map<Integer, Location>> locations;
private final int row;
private final int col;
static
{
locations = new HashMap<Integer, Map<Integer, Location>>();
}
private Location(final int r,
final int c)
{
if(r < 0)
{
throw new IllegalArgumentException("r must be >= 0, was: " + r);
}
if(c < 0)
{
throw new IllegalArgumentException("c must be >= 0, was: " + c);
}
row = r;
col = c;
}
public int getRow()
{
return (row);
}
public int getCol()
{
return (col);
}
// this ensures that only one location is created for each row/col pair... could not
// do that if the constructor was not private.
public static Location fromRowCol(final int row,
final int col)
{
Location location;
Map<Integer, Location> forRow;
if(row < 0)
{
throw new IllegalArgumentException("row must be >= 0, was: " + row);
}
if(col < 0)
{
throw new IllegalArgumentException("col must be >= 0, was: " + col);
}
forRow = locations.get(row);
if(forRow == null)
{
forRow = new HashMap<Integer, Location>(col);
locations.put(row, forRow);
}
location = forRow.get(col);
if(location == null)
{
location = new Location(row, col);
forRow.put(col, location);
}
return (location);
}
private static void ensureCapacity(final List<?> list,
final int size)
{
while(list.size() <= size)
{
list.add(null);
}
}
@Override
public int hashCode()
{
// should think up a better way to do this...
return (row * col);
}
@Override
public boolean equals(final Object obj)
{
final Location other;
if(obj == null)
{
return false;
}
if(getClass() != obj.getClass())
{
return false;
}
other = (Location)obj;
if(row != other.row)
{
return false;
}
if(col != other.col)
{
return false;
}
return true;
}
@Override
public String toString()
{
return ("[" + row + ", " + col + "]");
}
public int compareTo(final Location other)
{
final int val;
if(row == other.row)
{
val = col - other.col;
}
else
{
val = row - other.row;
}
return (val);
}
}
आपको यह कहां मिला बुरा अभ्यास? –
प्रश्न को फिर से लिखा;) डिफ़ॉल्ट इंटेलिजे निरीक्षण से पता चलता है कि यह है, और मुझे Google खोजों से एक निर्णायक उत्तर नहीं मिला था। – brasskazoo
नेटबीन के निरीक्षण से यह भी पता चलता है कि यह खराब अभ्यास है। – steve