2015-08-11 3 views
2

Когда в определении класса есть изменяемые частные поля, и добытчики/сеттера, которые выставляют их, мы получаем исключение выглядеть следующим образом:FindBugs не обнаруживает обнажая внутреннее представление с помощью определенного пользователя классов

[INFO] path.getInsertDate() may expose internal representation by returning Ttt.insertDate path.Ttt] At Ttt.java:[line 119] 

I 've добавил измененный класс:

public class Test { 
    public String test; 
} 

добавлено частное поле этого класса испытаний и геттеров/сеттеров. Но орехи проникают в нее.

public class ExposingTest { 
    private Test test; 

    //No warning here. 
    public Test getTest() { 
     return test; 
    } 
} 

Почему для этого предупреждения Findbugs проверяет только классы стандартной библиотеки java, но не пользовательские классы? Есть ли способ контролировать это?

+1

«? Почему он проверяет только классы Java для этой ошибки, но не пользовательские классы» - Ваши пользовательские классы не написаны на Java? возможно, это объясняет это. Я действительно не понимаю, что вы спрашиваете, и какова связь между ошибкой, которую вы опубликовали, и кодом, который вы опубликовали. –

+0

@ErwinBolwidt: Я имею в виду: почему он проверяет только стандартные классы библиотеки java se для этой ошибки, но не пользовательские классы? – Alexandr

+1

'Ttt.java' не является стандартным классом библиотеки Java SE. О чем ты говоришь? – EJP

ответ

4

TL; DR Findbugs генерирует это предупреждение для предопределенного набора классов.

Цель Findbugs - предупредить разработчиков о потенциальных проблемах с кодом. Findbugs не проверяет неизменность.

Совместимый класс как таковой, не является ошибкой или проблемой. Класс Mutable может быть допустимым выбором дизайна.

public class Person { 
    private Department dep; 

    public void setDepartment(Department dep) { 
     this.dep = dep; 
    } 
} 

public class Department { 
    private String name; 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

Для меня было бы очень неприятно, если бы Findbugs начали создавать предупреждения для каждого изменяемого класса.

Вместо этого Findbugs пытается найти потенциальные проблемы, изменяемые классы, которые разработчики склонны игнорировать. Вот метод FindBugs использует для обнаружения проблемных изменяемых классов (в классе edu.umd.cs.findbugs.detect.MutableStaticFields):

static boolean mutableSignature(String sig) { 
    return sig.equals("Ljava/util/Hashtable;") || 
      sig.equals("Ljava/util/Date;") || 
      sig.equals("Ljava/sql/Date;") || 
      sig.equals("Ljava/sql/Timestamp;") || 
      sig.charAt(0) == '['; 
} 

Так, FindBugs будет генерировать этот тип предупреждения (внутреннее облучение представления) для методов, которые возвращают:

  • Хеш-таблица;
  • Даты (java.util.Date, java.sql.Date, java.sql.Timestamp);
  • Массив

FindBugs не даже производить это предупреждение для списков и множеств.

0

Предположим, вы используете java.util.Date как возвращаемый тип в path.getInsertDate() String, примитивные обертки (Long, Short, ...) являются неизменяемыми объектами. Это безопасное возвращение и обмен ими. Но дата отличается магазином. У этого есть методы, чтобы мутировать. Он исправлен в Java 8, введя новый API Joda. Вы можете: - перейти на новый API - игнорировать это предупреждение - возвращает новую дату объект каждый раз, когда - дату возвращения, как долго

 Смежные вопросы

  • Нет связанных вопросов^_^