Соглашения об именах для сложных методов получения в Java - PullRequest
2 голосов
/ 03 июня 2010

Я читал эту MSDN статью об использовании свойств и методов в .NET. Это указывает, почему и когда использовать свойства или методы.

Свойства предназначены для использования как поля, что означает, что свойства должны не быть вычислительно сложным или производят побочные эффекты.

В противном случае следует использовать методы.

Я спрашивал себя, как вы можете выразить эту разницу в Java.

Каково ваше мнение?

Ответы [ 4 ]

5 голосов
/ 03 июня 2010

Я спрашивал себя, как вы можете выразить эту разницу в Java.

Просто не используйте префикс get в методе, так как обычно это означает, что метод будет дешевым (поскольку получатели обычно только получают доступ к полям, делегируют другим получателям или выполняют довольно простые вычисления на основе других получателей) , Например, если класс имеет этот интерфейс:

class Blob {
    long getLength() { ... }
    ByteBuffer getBytes() { ... }
    Sha1Checksum getChecksum() { ... }
}

... может показаться, что получение длины, содержимого и контрольной суммы из Blob одинаково дорого. Если мы сделали это, вместо этого:

interface Blob {
    long getLength() { ... }
    ByteBuffer getBytes() { ... }
    Sha1Checksum calculateChecksum() { ... }
}

... становится ясно (э-э), что мы можем ожидать, что calculateChecksum() будет дороже, чем другие операции, так как его название говорит о том, что он собирается сделать больше, чем просто получить что-то.

В определенной степени сложность - это проблема реализации, которую не следует видеть в интерфейсе (может быть, я решительно рассчитываю контрольную сумму при создании Blob?), Но бывают случаи, когда это имеет смысл провести различие.

3 голосов
/ 03 июня 2010

Я просто не согласен с тем, что говорится в этой статье. Свойства являются синтаксическим сахаром, иначе вы бы просто использовали поля.

Точка получения / свойств: инкапсуляция - пользователь не знает, является ли это просто полем, чем-то, что вы вычисляете каждый раз, или случайным значением.

Это означает, что для меня каждый класс в Java, который не является «структурой данных», имеет методы получения и установки для своих полей (которые должны быть доступны).

3 голосов
/ 03 июня 2010

Это зависит. Если все операции полностью внутренние, то getSomething() подходит даже для сложной реализации - весь смысл getters / setters / properties заключается в том, чтобы инкапсулировать детали реализации и скрыть их, даже если в будущем они изменятся на нечто сложное. *

Исключением является ситуация, когда операция настолько сложна, что может потребовать значительного количества времени или ресурсов (например, загрузить некоторые данные из Интернета). В этом случае я мог бы использовать другое имя метода - оно как бы нарушает инкапсуляцию, но полезно и практично.

Если получатель имеет какие-либо наблюдаемые побочные эффекты , я бы, вероятно, не использовал простое соглашение getSomething(), чтобы избежать путаницы. Может быть, я буду использовать updateAndReturn() или getAndComplexify() или getFromWeb() или что-то в этом роде.

2 голосов
/ 03 июня 2010

C # Свойство - это в основном Java getter и setter in one. Если мне нужно использовать как геттеры, так и сеттеры для одного экземпляра, я всегда выбираю свойство. В Java у меня нет этой опции.

...