Package Private Record Fields
August Nagro
augustnagro at gmail.com
Sun May 3 19:46:15 UTC 2020
Maybe I should ask instead, is there a good reason for Record fields to be
private, instead of package private?
What Mateusz suggests is convenient for the one class that declares the
Record, but why not let all package members access the fields directly?
Classes in the same package are part of the same api, and likely to be the
heaviest users of the declared Record. I'd think that the default access
modifier is 'Package Private' for a reason.
On Wed, Apr 29, 2020 at 1:05 PM August Nagro <augustnagro at gmail.com> wrote:
> Hi Remi,
>
> I only suggest that Record fields be package private instead of private.
>
> The fields are already final, so allowing classes in the same package to
> to refer to the fields directly would be convenient.
>
> I think it's fine, actually ideal, to have classes outside of the record's
> package to use the accessor methods.
>
> On Wed, Apr 29, 2020, 12:54 PM Remi Forax <forax at univ-mlv.fr> wrote:
>
>> ----- Mail original -----
>> > De: "August Nagro" <augustnagro at gmail.com>
>> > À: "Mateusz Romanowski" <romanowski.mateusz at gmail.com>
>> > Cc: "amber-dev" <amber-dev at openjdk.java.net>
>> > Envoyé: Mercredi 29 Avril 2020 16:43:57
>> > Objet: Re: Package Private Record Fields
>>
>> Hi August,
>>
>> > Thanks, I misunderstood your earlier mail.
>> >
>> > I have already been declaring some records in the class that makes the
>> most
>> > sense, but I'd argue that this is a poor substitute for package private
>> > fields.
>> >
>> > I hope it doesn't seem too much of a bikeshed over two `()` characters,
>> but
>> > I think it does make a difference, especially when using records for
>> math.
>>
>> I fail to see how it's related to records,
>> you want something that is usually called "uniform access", accessing
>> fields or accessors the same way without the parenthesis,
>> if we introduce this kind of feature (when revisiting operator
>> overloading perhaps), it will be very strange to have this feature working
>> only on records and not on classes.
>>
>> regards,
>> Rémi
>>
>> >
>> > On Wed, Apr 29, 2020, 9:03 AM Mateusz Romanowski <
>> > romanowski.mateusz at gmail.com> wrote:
>> >
>> >> OK, here you go.
>> >>
>> >> You can put the static method directly on the record, which is better
>> >> style as far as I am concerned:
>> >> ---
>> >> package ex;
>> >> import static java.lang.Math.*;
>> >> public final record Point(double x, double y) {
>> >> public static double distance(Point a, Point b) {
>> >> return sqrt(pow(b.x - a.x, 2) + pow(b.y - a.y, 2));
>> >> }
>> >> }
>> >> ---
>> >>
>> >> Or, you can put record inside the utility class:
>> >> ---
>> >> package ex;
>> >>
>> >> import static java.lang.Math.*;
>> >>
>> >> public class Maths {
>> >> record Point(int x, int y) { }
>> >>
>> >> public static double distance(Point a, Point b) {
>> >> return sqrt(pow(b.x - a.x, 2) + pow(b.y - a.y, 2));
>> >> }
>> >> }
>> >> ---
>> >>
>> >> /Mateusz
>> >>
>> >>
>> >> On Tue, Apr 28, 2020 at 8:51 PM August Nagro <augustnagro at gmail.com>
>> >> wrote:
>> >>
>> >>> Hi Mateusz,
>> >>>
>> >>> How would that improve the readability? Can you share an example?
>> >>>
>> >>> On Tue, Apr 28, 2020 at 3:45 PM Mateusz Romanowski <
>> >>> romanowski.mateusz at gmail.com> wrote:
>> >>>
>> >>>> Hi August,
>> >>>> Have you considered putting "friend" methods in the same source file,
>> >>>> and therefore using nest-based access control?
>> >>>>
>> >>>> Cheers,
>> >>>> Mateusz
>> >>>>
>> >>>> On Tuesday, April 28, 2020, August Nagro <augustnagro at gmail.com>
>> wrote:
>> >>>> > I'm enjoying using the Records preview so far.
>> >>>> >
>> >>>> > One thing I've noticed is that classes in the same package as the
>> >>>> Record
>> >>>> > are likely to be heavy users of its public accessor methods, and
>> that
>> >>>> the
>> >>>> > `()` can inhibit readability. For example,
>> >>>> >
>> >>>> > org/example/Point.java
>> >>>> > record Point(double x, double y) {}
>> >>>> >
>> >>>> > org/example/MathFunctions.java:
>> >>>> > import static java.lang.Math.*;
>> >>>> >
>> >>>> > class MathFunctions {
>> >>>> > public static double distance(Point a, Point b) {
>> >>>> > return sqrt(pow(b.x() - a.x(), 2) + pow(b.y() - a.x(), 2));
>> >>>> > }
>> >>>> > }
>> >>>> >
>> >>>> > It would be nice to be able to write:
>> >>>> >
>> >>>> > class MathFunctions {
>> >>>> > public static double distance(Point a, Point b) {
>> >>>> > return sqrt(pow(b.x - a.x, 2) + pow(b.y - a.x, 2));
>> >>>> > }
>> >>>> > }
>> >>>> >
>> >>>> > I understand the reason for not making them public.. the accessor
>> >>>> methods
>> >>>> > are good API design. But giving Record fields the default modifier
>> >>>> wouldn't
>> >>>> > change this.
>> >>>> >
>> >>>> > Regards,
>> >>>> >
>> >>>> > August
>> >>>> >
>> >>>
>>
>
More information about the amber-dev
mailing list