Eclipse Refactoring von Eigenschaften

Grizzly

Top Contributor
Nachdem mein bisheriger Rechner hier im Geschäft sich langsam auflöst, habe ich seit Montag eine neue Kiste im Einsatz. Bei der Gelegenheit habe ich auch gleich eine aktuellere Eclipse Version (Helios, Version: 3.6.2, Build id: M20110210-1200) aufgespielt. Allerdings musste ich jetzt feststellen, dass sich beim Refactoring von Eigenschaften irgendetwas geändert hat.
Java:
public class Beispiel {
	private int iAnzahl;
	
	public Beispiel() {
		super();
	}
	
	public int getIAnzahl() {
		return this.iAnzahl;
	}
	
	public void setIAnzahl(final int iAnzahl) {
		this.iAnzahl = iAnzahl;
	}
}
Wenn ich bisher versucht habe, das Feld iAnzahl umzubenennen, hat mir Eclipse immer angeboten, auch gleich die getter und setter Methode zu ändern. In der genannten Version ist das aber nicht mehr der Fall. :shock: Wenn ich das Feld in anzahl umbenenne und die zwei Methode ebenfalls entsprechend anpasse, bietet es mir Eclipse an. :bahnhof:

Kommt das gute Stück seit neuestem nicht mehr mit mehreren Großbuchstaben bei getter und setter Methode zurecht? Habe ich etwas verpasst? ???:L

In den Einstellungen habe ich auch schon alles abgesucht, aber nichts gefunden. Da gibt es nur eine Einstellungen, ob man gleich den Refactor Dialog haben möchte oder erst einmal diese "Inline" Geschichte.
 
S

SlaterB

Gast
ganz generell ist die Kombination von Attributen mit kG, also Kleinbuchstabe und dann Großbuchstabe am Anfang, zu vermeiden,
nicht nur bei Eclipse, auch in Web-Projekten mit JSP, bei Hibernate, allgemein bei allen Beans, also Attribut, setter, getter,

lohnt einfach die Mühe nicht, verzichte darauf
 
Zuletzt bearbeitet von einem Moderator:
M

maki

Gast
Versuche mal das Refactoring aus dem Menü auszurufen, nicht per shortcut.

Ansonsten hat SlaterB recht, iAnzahl ist schrecklich, unnütz & redundant, anzahl ist besser.
 

kama

Top Contributor

Grizzly

Top Contributor
@maki: Leider macht es keinen Unterschied, ob man das Refactoring über das Menü oder über den Shortcut aufruft. Wobei das dann voll der Sache noch die Krone aufgesetzt hätte.

@kama: Über die Seite bin ich auch schon gestolpert. Leider wird da nur generell der Umgang beschrieben. Mein Problem taucht da nirgends auf.

Okay, vielleicht kann man über Sinn und Unsinn streiten. Ich finde es aber generell schade, dass das plötzlich nicht mehr funktioniert. Das Refactoring hat bei mir nie Probleme gemacht, weder bei Eigenschaften mit einem Klein- und dann einem Großbuchstaben, noch bei anders benamsten Eigenschaften. Folglich wäre da kein Grund gewesen, die Sache zu ändern. Naja...
 
M

maki

Gast
Markiere die Variable, drücke doch mal Alt+Shift+R, dann sollte ein Hovertext erschienen, der einen Pfeil nach unten anbietet, im Kontextmenü dann "open rename Dialog", da kannst du die setter & getter mitändern lassen, und auch Textdateien.
 

kama

Top Contributor
Hallo,

@kama: Über die Seite bin ich auch schon gestolpert. Leider wird da nur generell der Umgang beschrieben. Mein Problem taucht da nirgends auf.
Doch da wird genau beschrieben, dass man das Rename mit oder OHNE Dialog machen kann und somit auch den default einstellen kann. Einmal einstellen

Window > Preferences > Java and unchecking Rename in editor without dialog.

Einmal ein refactoring machen und dann entsprechend auswählen im Dialog ...danach kann man dass wieder einstellen, dass man OHNE Dialog arbeiten möchte.

und danach werden auch in einem Rutsch die getter/setter mit umbenannt per Shift-Alt-R ...

Gruß
Karl Heinz Marbaise
 

Grizzly

Top Contributor
Okay, vielleicht habe ich mich etwas unglücklich ausgedrückt:

In der Default Einstellungen bekommt man beim Drücken Alt+Shift+R diese Inline-Refactor-Möglichkeit. Drückt man dann ein weiteres Mal Alt+Shift+R oder geht gleich über den Menüpunkt im Menü oder deaktiviert die Inline-Refactor-Möglichkeit in den Einstellungen (bzw. man aktiviert, dass sofort der Dialog erscheint), landet man im "Rename Field" Dialog. Das ist mir bekannt.

Nun habe ich aber das Problem, dass die beiden Checkboxen "Rename getter method" und "Rename setter method" deaktiviert sind. Sprich Eclipse bzw. das Refactoring erkennt gar nicht, dass für die Eigenschaften getter oder setter Methoden in der Klasse vorhanden sind.

Dies alles gilt aber nur, wenn der Name der Eigenschaft mit einem Kleinbuchstaben beginnt und danach gleich ein Großbuchstabe kommt. Allerdings verstehe ich das nicht ganz. Ein Mensch würde doch nach getter/setter Methoden nach folgendem Schema suchen:
get[1. Buchstabe groß][Rest ab 2. Buchstabe]
set[1. Buchstabe groß][Rest ab 2. Buchstabe]
Keine Ahnung, wie das Eclipse macht.
 
M

maki

Gast
Es gibt JavaBeans konventionen, denen auch du folgen solltest.
Wie du siehst funktioniert ja alles wenn die Konvention eingehalten wurde.

Was du da beschreibst verstösst gegen diese Konvention, Menschen die diese Konvention kennen verhalten sich wie Eclipse in so einem Falle was die Zuordnung der getter/Setter betrifft ;)

SlaterB hat das ja schon in seinem ersten Post hier klargestellt ;)
 
S

SlaterB

Gast
also ich halte es auch für einen vermeidbaren Bug, den richtigen Grund kenne ich nicht,
wenn man sich an "get[1. Buchstabe groß][Rest ab 2. Buchstabe]" hält müsste es durchaus 'eigentlich' gehen,
tut es nur manchmal nicht,
wobei das von meiner Seite auch nur teils Gerücht ist, konkrete Fälle kann ich nicht nennen weil ich sie einfach vermeide ;)
 

schalentier

Gesperrter Benutzer
Ich hab mal bisschen gegoogelt, leider keine richtige Spezifikation zu den JavaBeans gefunden. Aber ich hab ne Methode im JDK gefunden:

java.beans.Introspector
Java:
 /**
     * Utility method to take a string and convert it to normal Java variable
     * name capitalization.  This normally means converting the first
     * character from upper case to lower case, but in the (unusual) special
     * case when there is more than one character and both the first and
     * second characters are upper case, we leave it alone.
     * <p>
     * Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays
     * as "URL".
     *
     * @param  name The string to be decapitalized.
     * @return  The decapitalized version of the string.
     */
    public static String decapitalize(String name) {
	if (name == null || name.length() == 0) {
	    return name;
	}
	if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
			Character.isUpperCase(name.charAt(0))){
	    return name;
	}
	char chars[] = name.toCharArray();
	chars[0] = Character.toLowerCase(chars[0]);
	return new String(chars);
    }

Kurz: Der korrekte Name der Instanzvariable muesste IAnzahl lauten. Dann sollte auch das Refaktoring klappen.
 

Grizzly

Top Contributor
Es gibt JavaBeans konventionen, denen auch du folgen solltest.
Wie du siehst funktioniert ja alles wenn die Konvention eingehalten wurde.

Was du da beschreibst verstösst gegen diese Konvention, Menschen die diese Konvention kennen verhalten sich wie Eclipse in so einem Falle was die Zuordnung der getter/Setter betrifft ;)

SlaterB hat das ja schon in seinem ersten Post hier klargestellt ;)

Das mit den generellen Konventionen ist mir schon klar. ;)
Allerdings nicht, warum die Geschichte von der einen auf die andere Eclipse Version plötzlich nicht mehr funktioniert. :mad:
Ich habe jetzt mal einen Eintrag in Bugzilla des Eclipse Projekts gestellt. Mal schauen, was dabei rauskommt.
 

Grizzly

Top Contributor
Es ist aber ein Unterschied zwischen einer Konvention und der Mechanik der IDE. Ich würde es verstehen, wenn der Compiler den Code auch nicht schlucken würde. Tut er aber. Und im Endeffekt ist Refactoring bzw. des Umbenennen von Klasse Eigenschaften nicht in einmal etwas spezielles von Java. Da sollte man schon trennen. Oder - wenn man es so will - sollte dann die IDE schon vorher das anmeckern und als Fehler anzeigen.

Wie schon gesagt: Schauen wir mal, was die Entwickler von Eclipse sagen. Ob es gewollt ist oder einfach nur ein Bug.
 

Oben