Что касается того, как справиться с ограничением размера пути в Windows - использование 7zip для упаковки (и распаковки) ваших файлов, чувствительных к длине пути, кажется приемлемым обходным путем. Я использовал его для переноса нескольких инсталляций IDE (эти пути к подключаемым модулям Eclipse, yikes!) И груды автоматически сгенерированной документации, и до сих пор не было ни одной проблемы.
Не совсем уверен, как он уклоняется от ограничения в 260 символов, установленного Windows (из технической точки зрения), но эй, это работает!
Более подробная информация на их странице SourceForge здесь :
«NTFS может фактически поддерживать имена путей длиной до 32 000 символов.»
7 -zip также поддерживает такие длинные имена.
Но это отключено в коде SFX. Некоторым пользователям не нравятся длинные пути, так как они не понимают, как с ними работать. Вот почему я отключил его в коде SFX.
9.32 alpha 2013-12-01
- Улучшена поддержка имен файлов длиннее 260 символов .
4.44 beta 2007-01-20
- 7-Zip теперь поддерживает имена файлов длиннее 260 символов.
ВАЖНОЕ ПРИМЕЧАНИЕ: Чтобы это работало правильно, вам нужно указать путь назначения в диалоговом окне «Извлечь» 7zip напрямую, а не перетаскивание & amp; сбросив файлы в нужную папку. В противном случае папка «Temp» будет использоваться в качестве промежуточного кэша, и вы попадете в то же ограничение в 260 символов, как только Windows Explorer начнет перемещать файлы в их «окончательное место покоя». См. Ответы на на этот вопрос для получения дополнительной информации.
System.identityHashCode (Object) обеспечивает такое поведение.
Вы должны написать следующее:
class B extends A {
public int hashCode() {
return System.identityHashCode(this);
}
}
Пожалуйста, проверьте метод equals, он возвращает true, только если два объекты такие же. В противном случае будет нарушено поведение, описанное для , равного и hashCode . (Чтобы быть правильным, метод equals должен возвращать false, если вы получаете разные хэш-коды для двух объектов.) Чтобы обеспечить реализацию equals (), которая соответствует данному методу hashCode ():
public boolean equals(Object other){
return this == other;
}
Используйте System.identityHashCode ()
. Это то, что использует IdentityHashMap
.
Вам следует крайне опасаться переопределения существующего hashCode ()
, потому что вы можете нарушить контракт hashCode, это два объекта, которые:
если a.equals (b), то a.hashCode () должен быть равен b.hashCode ()
Вы можете нарушить это, переопределив существующее поведение, или вам может потребоваться переопределить equals () тоже.
Как все сказал Мнемент, я просто хотел бы отметить, что hashCode (), возвращающий 0 (или любое постоянное значение), действителен (пока не работает). hashCode () может (и должен) возвращать разные значения для a и b, только если! a.equals (b).
Так, например, у вас есть
class A {
public int hashCode() {
return 0;
}
public boolean equals(Object o) {
return o instanceof A; // all objects are equal
}
}
class B extends A {
public int hashCode() {
return System.identityHashCode(this);
}
public boolean equals(Object o) {
return this.hashCode().equals(o.hashCode());
}
}
. Теперь вы создаете два объекта:
A a = new A();
A b = new B();
И вдруг a.equals (b), но! B.equals (a). Конечно, в реальной жизни equals () в A будет более сложным, но проблема все еще сохраняется. Чтобы избавиться от этой проблемы, вы хотите всегда вызывать
if (super.equals(o)) return true;
в начале new equals ().
А поскольку переопределение hashCode () строго привязано к переопределению equals (), вы хотите убедиться, что везде super. equals () вернет true для любых двух заданных объектов, new hashCode () вернет super.hashCode ().