Как мога да създам полезен клас?

Искам например да създам клас с помощни методи

public class Util {

   public static void f (int i) {...}

   public static int g (int i, int j) {...}

}

Кой е най-добрият метод за създаване на полезен клас?

Трябва ли да използвам частен конструктор?

Трябва ли да направя полезния клас за абстрактен клас?

Нищо ли да не правя?


person user2693979    schedule 09.08.2014    source източник
comment
когато програмирате, обикновено няма най-добър начин да направите нещо   -  person William Reed    schedule 10.08.2014
comment
Най-чистият начин за създаване на помощен клас projectlombok.org/features/experimental/UtilityClass   -  person adimoh    schedule 03.12.2018
comment
Should I do nothing? Как дзен.   -  person awwsmm    schedule 07.12.2018
comment
@WilliamReed Всъщност най-доброто е специфично за контекста. :Д   -  person Sreekanth Karumanaghat    schedule 28.03.2019
comment
@SreekanthKarumanaghat, да, бих се съгласил. мнението ми се промени много, откакто оставих този коментар   -  person William Reed    schedule 28.03.2019
comment
използвайте projectlombok.org/features/experimental/UtilityClass анотация @UtilityClass от lombok.   -  person user811602    schedule 21.05.2020


Отговори (4)


За напълно бездържавен помощен клас в Java предлагам класът да бъде деклариран public и final и да има частен конструктор, за да предотврати инстанцирането. Ключовата дума final предотвратява подкласиране и може да подобри ефективността по време на изпълнение.

Класът трябва да съдържа всички static методи и не трябва да се декларира abstract (тъй като това би означавало, че класът не е конкретен и трябва да бъде имплементиран по някакъв начин).

На класа трябва да се даде име, което съответства на неговия набор от предоставени помощни програми (или „Util“, ако класът трябва да предостави широк набор от некатегоризирани помощни програми).

Класът не трябва да съдържа вложен клас, освен ако вложеният клас трябва да бъде и полезен клас (въпреки че тази практика е потенциално сложна и вреди на четливостта).

Методите в класа трябва да имат подходящи имена.

Методите, използвани само от самия клас, трябва да бъдат частни.

Класът не трябва да има нефинални/нестатични класови полета.

Класът може също така да бъде импортиран статично от други класове, за да се подобри четимостта на кода (това обаче зависи от сложността на проекта).

Пример:

public final class ExampleUtilities {
    // Example Utility method
    public static int foo(int i, int j) {
        int val;

        //Do stuff

        return val;
    }

    // Example Utility method overloaded
    public static float foo(float i, float j) {
        float val;

        //Do stuff

        return val;
    }

    // Example Utility method calling private method
    public static long bar(int p) {
        return hid(p) * hid(p);
    }

    // Example private method
    private static long hid(int i) {
        return i * 2 + 1;
    }
}

Може би най-важното от всичко е, че документацията за всеки метод трябва да бъде точна и описателна. Вероятно методите от този клас ще се използват много често и е добре да имате висококачествена документация, която да допълва кода.

person initramfs    schedule 09.08.2014
comment
Бих подчертал, че качествената документация означава пълни коментари на JavaDoc, а не коментари на кода. - person Brian Kelly; 03.05.2017
comment
@initramfs това е хубав отговор, но бихте ли могли да адаптирате примера си според това, което пишете, за да бъде последователен!? - person karlihnos; 21.12.2017
comment
Може би най-важното от всичко е, че документацията за всеки метод трябва да бъде точна и описателна. Вероятно методите от този клас ще се използват много често и е добре да имате висококачествена документация, която да допълва кода. Моля, актуализирайте коментарите на javadoc за горния код. Вижте oracle.com/technical-resources/articles/java/javadoc -tool.html - person razvanone; 01.04.2021

Според Joshua Bloch (Effective Java), трябва да използвате частен конструктор, който винаги хвърля изключение. Това най-накрая ще обезсърчи потребителя да създаде екземпляр на util клас.

Маркирането на абстрактен клас не се препоръчва, защото абстрактен подсказва на читателя, че класът е предназначен за наследяване.

person michaldo    schedule 09.08.2014
comment
Не разбрах. Защо трябва да хвърляте изключение в частен конструктор, ако той е частен и класът няма да бъде създаден, следователно изключение никога няма да бъде хвърлено? - person Johnny Five; 14.08.2019
comment
@JohnnyFive private-constructor-throwing-exception е концепция на Joshua Block за обявяване на разработчиците, които четат кода, че НЕ трябва да създават екземпляр. - person michaldo; 16.02.2020
comment
@JohnnyFive изключение или дори AssertionError трябва да бъде хвърлено, защото с помощта на отражение все още имате достъп до частен конструктор. Чрез хвърляне на изключение или грешка можете да гарантирате, че не може да бъде създаден екземпляр на класа. - person Felix S; 09.06.2020
comment
@JohnnyFive От книгата, AssertionError не е строго задължителен, но осигурява застраховка в случай, че конструкторът бъде случайно извикан от класа. - person Leponzo; 05.04.2021

Бих направил класа final и всеки метод ще бъде static.

Така че класът не може да бъде разширен и методите могат да бъдат извикани от Classname.methodName. Ако добавите членове, уверете се, че работят безопасно ;)

person duffy356    schedule 09.08.2014

Създаването на клас abstract изпраща съобщение до читателите на вашия код, че искате потребителите на вашия abstract клас да го подкласират. Това обаче не е това, което искате да направите тогава: полезен клас не трябва да бъде подклас.

Следователно добавянето на частен конструктор е по-добър избор тук. Трябва също така да направите класа final, за да забраните подкласирането на вашия полезен клас.

person Sergey Kalinichenko    schedule 09.08.2014