2015-06-06 6 views
46

ich IntelliJ verwendet für "Code-Inspect", und eines seiner Ergebnisse ist:Was bedeutet "Kann Paket lokal sein"? (IDEA Inspection)

Problem Synopse Paket lokal (in Zeile 18 (public class HeartBeat)) sein Können

Was bedeutet es, wie kann ich repariere es?

es ganze Klasse ist wie folgt:

package com.xxxxxxxxxxx.app.xxxx; 

public class HeartBeat 
{ 
    private static final Logger LOG = LoggerFactory.getLogger(HeartBeat.class); 
    private final File heartBeatFile; 


    public HeartBeat(File heartBeatFile) 
    { 
     this.heartBeatFile = heartBeatFile; 
    } 


    public void beat() 
    { 
     try 
     { 
      FileUtils.writeStringToFile(heartBeatFile, String.valueOf(System.currentTimeMillis())); 
     } 
     catch(IOException e) 
     { 
      LOG.error("Error while writing heart beat log", e); 
     } 
    } 
} 
+0

Ist es für Java-Code? –

+0

Ja, für Java-Code. –

+1

Ich rate, dass Sie etwas als öffentlich zugänglich gemacht haben, das nie außerhalb des Pakets verwendet wird? – Romski

Antwort

76

IDEA bezieht sich auf Paket-private Sichtbarkeit.

Eine Klasse kann mit dem Modifikator public deklariert werden. In diesem Fall ist diese Klasse für alle Klassen überall sichtbar. Wenn eine Klasse keine Modifier (Standard, auch als Paket-private bekannt) hat, ist es nur sichtbar innerhalb des eigenen Pakets

Weitere Informationen finden Sie Controlling Access to Members of a Class.

Sie können das Problem lösen, indem Sie das Schlüsselwort public aus der Klasse entfernen (wenn die Klasse nicht außerhalb des Pakets verwendet werden soll) oder die Klasse aus einem anderen Paket verwenden.

1

Ihr Herzschlag Klasse nicht irgendwo außerhalb des Pakets com.xxxxxxxxxxx.app.xxxx verwendet wird. In diesem Fall können Sie die Klasse "protected" oder "private" deklarieren, um präziser in Ihrem Zugriff zu sein.

Wenn Sie diese Klasse nicht außerhalb dieses Pakets verwenden möchten, sollten Sie die Klassendeklaration ändern. Wenn Sie beabsichtigen, diese Klasse außerhalb dieses Pakets zu verwenden, lassen Sie sie und die Warnung verschwindet.

Z. B .:

protected class HeartBeat { 
    ... 
} 
+0

In diesem Fall kann er es "privat" erklären? – Tom

+0

@Tom Wenn die Klasse 'privat' deklariert wird, wird verhindert, dass sie von anderen Klassen im selben Paket erkannt wird. Eine Klasse, die als 'privat' deklariert ist, kann nur von der Klasse gesehen werden, in der sie deklariert wurde. Meistens für innere Klassen verwendet. Es ist höchstwahrscheinlich das OP will 'protected'game – devonlazarus

+0

Ich weiß das. Ich frage mich, warum Sie "privat" erwähnt haben, denn es ist klar, dass es hier nicht verwendet werden kann. (Repost aufgrund von Grammatikproblemen) – Tom

67

Wenn Sie diese Warnung zu unterdrücken:

  1. zu Einstellungen gehen -> Editor -> Inspektionen
  2. Zum Java -> Erklärung Redundanz
  3. Select "Erklärung Zugriff kann schwächer sein"
  4. Deaktivieren Sie die „Paket lokale Sichtbarkeit vorschlagen ...“ Kontrollkästchen auf die rechts

EDIT : in der neuesten IDEA Release-Schritt 4 scheint dies auf "Paket-private Sichtbarkeitsstufe für ..." geändert zu haben und enthält verschiedene Optionen für verschiedene Bedingungen

+8

Dies ist die praktische Antwort. –

+0

Normalerweise ist es ziemlich einfach, einen Analyse-/Inspect-Code-Vorgang auf dem Modul auszuführen, um herauszufinden, welche Lint-Warnung ausgeschaltet werden soll. Diese erschien nicht in dem Bericht (ab AS 2.2 RC) - und war somit in der endlosen Liste der Inspektionsoptionen schwerer zu finden. –

+0

Sie können Warnungen immer ausschalten, wo immer sie erscheinen: (Cursor on warning) -> alt eingeben -> "warning name" -> inspection deaktivieren. Dieses ist ziemlich nutzlos imho, also habe ich es immer ausgeschaltet. – Cubic

0

Kommt aus dem Android-App-Hintergrund, müssen Sie auch daran denken manchmal sind diese Warnungen überflüssig. Also für debug build Klassen kann es package local sein, aber für release build könnte es außerhalb des Pakets verwendet werden.

Ich habe es an meinem Ende deaktiviert und @ashario Antwort war ziemlich hilfreich bei der Suche, wie es geht.

20

Manchmal flackert Lint falsch. Jede dieser Warnmeldungen kann einzeln mit dem folgenden Code unterdrückt werden.

@SuppressWarnings("WeakerAccess") 
+2

Dies ist auch eine potenziell korrekte Antwort, wenn Sie Methoden bereitstellen, die extern für Ihr Projekt verwendet werden (z. B. Sie schreiben Code für ein Framework wie mich), möchten aber nicht die Warnmeldungen für alles andere verlieren indem Sie es in den Einstellungen ausschalten. Wir haben Tests um diese Methoden herum, aber weil sie im selben Paket sind, sagt uns der Linter, dass wir die Methode von public auf default reduzieren sollen. – Mykaelos

+2

Ich habe diese spezielle Flusenwarnung einige Male falsch angezeigt, und diese Unterdrückung war für mich die richtige Problemumgehung von Fall zu Fall. – seekingStillness

+1

Dies sollte die richtige Antwort markiert sein. Wenn Sie mit einer Dienstprogrammklasse arbeiten, sollte dies unterdrückt werden. In regelmäßigen Klassen möchten Sie jedoch, dass dies vorhanden ist, da es gute Programmierpraktiken durchsetzt. – kjdion84