Jaka jest różnica między polem, zmienną, atrybutem i właściwością w POJO języka Java?

142

Odnosząc się do wewnętrznych zmiennych prywatnych POJO Java, które mają metody pobierające / ustawiające, użyłem następujących terminów:

  • pole
  • zmienna
  • atrybut
  • własność

Czy jest jakaś różnica między powyższymi? Jeśli tak, jakiego terminu należy użyć? Czy istnieje inny termin, którego należy użyć, gdy ta jednostka jest utrwalana?

Victor Lyuboslavsky
źródło

Odpowiedzi:

117

Stąd: http://docs.oracle.com/javase/tutorial/information/glossary.html


  • pole

    • Członek danych klasy. O ile nie określono inaczej, pole nie jest statyczne.

  • własność

    • Charakterystyka obiektu, który użytkownicy mogą ustawiać, na przykład kolor okna.

  • atrybut

    • Nie wymieniony w powyższym glosariuszu

  • zmienna

    • Element danych nazwany identyfikatorem. Każda zmienna ma typ, taki jak int lub Object, oraz zakres. Zobacz także zmienna klasy, zmienna instancji, zmienna lokalna.
jahroy
źródło
27
Nadal nie rozumiem różnicy między polem a nieruchomością?
Koray Tugay
1
@KorayTugay - Spójrz na pole jako na elementarną informację związaną z obiektem. Właściwość (dla mnie) jest cechą obiektu, który jest widoczny (i najwyraźniej zmienny) dla świata zewnętrznego.
jahroy
Na podstawie powyższego, czy można byłoby powiedzieć „Właściwości i pola są takie same, z wyjątkiem tego, że właściwość jest polem ustawialnym ”?
jdurston
2
@John - Może na podstawie powyższego, co, jak wspomniano, jest kopiowaniem / wklejaniem z Oracle. Osobiście dokonałbym rozróżnienia, że ​​właściwość jest publicznie widoczna i prawdopodobnie zmienna, podczas gdy pole może być wewnętrznym, prywatnym polem używanym tylko przez klasę.
jahroy
1
Myślę, że najlepszą rzeczą do podkreślenia jest to, że istnienie jako pole i jako własność nie wykluczają się wzajemnie. Ze sposobu sformułowania tej odpowiedzi dla nowych programistów wygląda to jak lista różnych rzeczy.
Kartik Chugh
89

Tak jest.

Zmienna może być lokalna, polowa lub stała (chociaż jest to technicznie błędne). Jest niejasny jak atrybut. Powinieneś także wiedzieć, że niektórzy lubią wywoływać końcowe zmienne niestatyczne (lokalne lub instancyjne)

Wartości ”. Prawdopodobnie pochodzi to z pojawiających się języków JVM FP, takich jak Scala.

Pole jest zazwyczaj zmienną prywatną w klasie instancji. Nie oznacza to, że istnieje metoda pobierająca i ustawiająca.

Atrybut to niejasny termin. Można go łatwo pomylić z XML lub Java Naming API. Staraj się unikać tego terminu.

Właściwość jest kombinacją pobierającą i ustawiającą.

Kilka przykładów poniżej

public class Variables {

    //Constant
    public final static String MY_VARIABLE = "that was a lot for a constant";

    //Value
    final String dontChangeMeBro = "my god that is still long for a val";

    //Field
    protected String flipMe = "wee!!!";

    //Property
    private String ifYouThoughtTheConstantWasVerboseHaHa;

    //Still the property
    public String getIfYouThoughtTheConstantWasVerboseHaHa() {
        return ifYouThoughtTheConstantWasVerboseHaHa;
    }

    //And now the setter
    public void setIfYouThoughtTheConstantWasVerboseHaHa(String ifYouThoughtTheConstantWasVerboseHaHa) {
        this.ifYouThoughtTheConstantWasVerboseHaHa = ifYouThoughtTheConstantWasVerboseHaHa;
    }

}

Kombinacji jest znacznie więcej, ale palce się męczą :)

Adam Gent
źródło
3
@Chris Thompson Tak nazywa to Eclipse w jednym ze swoich okien dialogowych. Hej, ludzie, to Java. Cóż mam ci powiedzieć. To nie ma sensu.
Adam Gent,
4
@AdamGent JAVA = Just Another Vague Acronym :)
emory
@emory Cóż, to stary dobrze znany oksymoron. To nic specyficznego dla Javy, ten „problem” sięga co najmniej do C i prawdopodobnie dłużej… oczywiście nic nie
Voo
@AdamGent Nie było to poważne, po prostu utrudniło ci to ;-)
Chris Thompson
1
Dobre wyjaśnienie, jednocześnie wyśmiewając, że nazwy identyfikatorów mogą stać się absurdalnie długie (a często są śmiesznie długie).
sargas
5

Jeśli pytanie zostało podpowiedziane przy użyciu JAXB i chcąc wybrać właściwe XMLAccessType, miałem to samo pytanie. Dokument JAXB Javadoc mówi, że „pole” jest niestatyczną, trwałą zmienną instancji. „Właściwość” ma parę pobierającą / ustawiającą (więc powinna to być zmienna prywatna). „Członek publiczny” jest publiczny i dlatego prawdopodobnie jest stałą. Również w JAXB „atrybut” odnosi się do części elementu XML, jak w<myElement myAttribute="first">hello world</myElement> .

Wydaje się, że ogólnie „właściwość” Javy można zdefiniować jako pole z co najmniej funkcją pobierającą lub inną publiczną metodą, która pozwala uzyskać jej wartość. Niektórzy mówią też, że nieruchomość musi mieć setera. W przypadku takich definicji kontekst jest wszystkim.

hotshot309
źródło
5

Dietel i Dietel mają przyjemny sposób wyjaśniania pól i zmiennych.

„Razem zmienne statyczne klasy i zmienne instancji są nazywane jej polami”. (Punkt 6.3)

„Zmienne powinny być deklarowane jako pola tylko wtedy, gdy są wymagane do użycia w więcej niż jednej metodzie klasy lub jeśli program powinien zapisywać ich wartości między wywołaniami metod klasy”. (Punkt 6.4)

Zatem pola klasy są jej zmiennymi statycznymi lub zmiennymi instancji - tj. Zadeklarowanymi w zakresie klasy.

Odniesienie - Dietel P., Dietel, H. - Java ™ How To Program (Early Objects), Tenth Edition (2014)

Mango
źródło
3

Jeśli weźmiesz wskazówkę z Hibernate:

Hibernate odczytuje / zapisuje stan obiektu wraz z jego polem. Hibernate mapuje również właściwości stylu Java Bean na schemat DB. Hibernacja Dostęp do pól w celu załadowania / zapisania obiektu. Jeśli mapowanie jest wykonywane przez właściwość, hibernacja używa metod pobierających i ustawiających.

To właśnie hermetyzacja rozróżnia środki, w których masz metody pobierające / ustawiające dla pola i nazywa się to właściwością, dzięki czemu ukrywamy podstawową strukturę danych tej właściwości w ramach metody setMethod, dzięki czemu możemy zapobiec niepożądanym zmianom w elementach ustawiających. Wszystko, co oznacza hermetyzacja ...

Pola muszą zostać zadeklarowane i zainicjowane przed ich użyciem. Głównie do użytku wewnętrznego klasy.

Właściwości mogą być zmieniane przez ustawiającego i są one ujawniane przez metody pobierające. Tutaj cena pola ma pobierające / ustawiające wartości, więc jest to właściwość.

class Car{
 private double price;
 public double getPrice() {…};
 private void setPrice(double newPrice) {…};
}

<class name="Car" …>
<property name="price" column="PRICE"/>
</class>

Podobnie używając pól , [W hibernacji jest to zalecany sposób MAP przy użyciu pól, gdzie private int id; ma adnotację @Id, ale dzięki Property masz większą kontrolę]

class Car{
  private double price;
}
<class name="Car">
<property name=" price" column="PRICE" access="field"/>
</class>

Dokument w języku Java mówi: Pole jest składnikiem danych klasy. Pole jest niestatyczną, trwałą zmienną instancji. Pole jest zazwyczaj zmienną prywatną w klasie instancji.

vimal krishna
źródło
2

Zmienne składają się z pól i nie-pól.

Pola mogą być:

  1. Pola statyczne lub
  2. pola niestatyczne zwane również instancjami, np. x = F ()

Pola niebędące polami mogą być:

  1. zmienne lokalne, analog pól, ale wewnątrz metod, a nie poza nimi wszystkimi, lub
  2. parametry np. y in x = f (y)

Podsumowując, kluczową różnicą między zmiennymi jest to, czy są polami, czy nie, co oznacza, czy znajdują się wewnątrz metod, czy poza wszystkimi metodami.

Podstawowy przykład (przepraszam za moją składnię, jestem tylko początkującym)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}
the_prole
źródło
1

W rzeczywistości te dwa terminy są często używane do reprezentowania tego samego, ale są pewne wyjątkowe sytuacje. Pole może przechowywać stan obiektu. Również wszystkie pola są zmiennymi. Jest więc jasne, że mogą istnieć zmienne, które nie są polami. Patrząc więc na 4 typy zmiennych (zmienna klasy, zmienna instancji, zmienna lokalna i zmienna parametryczna), możemy zobaczyć, że zmienne klas i zmienne instancji mogą wpływać na stan obiektu. Innymi słowy, jeśli zmienna klasy lub instancji zmienia się, zmienia się stan obiektu. Możemy więc powiedzieć, że zmienne klas i zmienne instancji są polami, podczas gdy zmienne lokalne i zmienne parametrów nie są.

Jeśli chcesz głębiej zrozumieć, możesz udać się do źródła poniżej: -

http://sajupauledayan.com/java/fields-vs-variables-in-java

Sagar Patel
źródło
0

Pytanie jest stare, ale inną ważną różnicą między zmienną a polem jest to, że pole otrzymuje wartość domyślną, gdy jest zadeklarowane, natomiast zmienna musi zostać zainicjowana.

Peter Clause
źródło
A co z nieruchomością?
Koray Tugay
0

Rozumiem jak poniżej i nie twierdzę, że jest to w 100% poprawne, równie dobrze mogę się mylić.

Zmienna jest coś, co deklarują, które mogą domyślnie zmian i mają różne wartości, ale może być również wyraźnie mówi się, że ostateczna. W Javie byłoby to:

public class Variables {

    List<Object> listVariable; // declared but not assigned
    final int aFinalVariableExample = 5; // declared, assigned and said to be final!

    Integer foo(List<Object> someOtherObjectListVariable) {
        // declare..
        Object iAmAlsoAVariable;

        // assign a value..
        iAmAlsoAVariable = 5;

        // change its value..
        iAmAlsoAVariable = 8;

        someOtherObjectListVariable.add(iAmAlsoAVariable);

        return new Integer();
    }
}

Zasadniczo zmienna to wszystko, co jest zadeklarowane i może przechowywać wartości. Powyższa metoda foo zwraca na przykład zmienną .. Zwraca zmienną typu Integer, która przechowuje adres pamięci nowej Integer (); Wszystko inne, co widzisz powyżej, to także zmienne, listVariable, aFinalVariableExample i wyjaśniono tutaj:

Pole to zmienna, której zakres jest bardziej przejrzysty (lub konkretny). Zmienna powracająca z zakresu metody foo nie jest jasna w powyższym przykładzie, więc nie nazwałbym jej polem. Z drugiej strony iAmAlsoVariable jest polem „lokalnym”, ograniczonym zakresem metody foo, a listVariable jest polem „instancji”, w którym zasięg pola (zmiennej) jest ograniczony zasięgiem obiektów.

Właściwość to pole, do którego można uzyskać dostęp / zmodyfikować. Każde pole, które uwidacznia metodę pobierającą / ustawiającą, jest właściwością.

Nie znam atrybutu i chciałbym również powtórzyć, że tak rozumiem, czym są zmienne, pola i właściwości.

Koray Tugay
źródło
0
  • variable- nazwany adres przechowywania. Każda zmienna ma typ, który definiuje rozmiar pamięci, atrybuty i zachowania. Są dla typów zmiennych Java: class variable, instance variable, local variable,method parameter
//pattern
<Java_type> <name> ;

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field- zmienna składowa lub członek danych. To jest variablewewnątrz class( class variablelub instance variable)

  • attribute- w niektórych artykułach można znaleźć, attributeże jest to objectreprezentacja class variable. Objectoperuje, za pomocą attributesktórego definiuje zbiór cech.

CustomClass myCustomClass = new CustomClass();
myCustomClass.something = "poor fantasy"; //something is an attribute of myCustomClass object with a "poor fantasy" value
  • property- field+ ograniczony getter/setter. Ma składnię pola, ale używa metod pod maską. Javanie obsługuje go w czystej postaci. Spójrz na Objective-C, Swift,Kotlin

Na przykład Kotlinpróbka:

//field - Backing Field
class Person {
    var name: String = "default name"
        get() = field
        set(value) { field = value }
}

//using
val person = Person()
person.name = "Alex"    // setter is used
println(person.name)    // getter is used

[Zmienna Swift, właściwość]

yoAlex5
źródło