Hur ska jag kunna använda JSON för att använda getters och setters osv?

Skrivet av heretic16:

Alltså är Spring IOC ungefär samma sak som public static?

Typ, på hög nivå kanske

Static gör ju så att en variabel eller metod tillhör klassen och inte objekten (går inte göra static outer class, bara inner). Medan Singleton är att det bara finns ett enda objekt instantierat av en klass.

Skrivet av heretic16:

Ja. Public static menar jag.

public static är inte en egen modifierare. Både public och static kan förekomma utan den andra; det vill säga, du kan ha till exempel public int eller private static int.

Citat:

Jag har hört att static är anti-oop.

Det borde du se som något positivt. Jag får intrycket att du gärna skriver överdrivet objektorienterad/imperativ kod baserad nästan helt på muterbart tillstånd. Sådan kod är ofta svår att uppnå korrekt semantik med, och även om man lyckas tenderar koden att bli så bräcklig att ingen – inte ens man själv – någonsin vågar redigera den.

Försök bygga en större andel av din kod i form av rena funktioner, så blir det lättare för dig att skriva korrekt, begriplig, maintainable kod. Rent konkret ser en ren funktion i Java i praktiken oftast ut så här:

public static Y f(X x) { // Inga sidoeffekter här; enbart beräkning av f(x) baserat på x. }

Ett annat konkret råd är att ha final som utgångsläge på alla variabler/fält, och bara skippa den när variabeln/fältet faktiskt behöver kunna muteras.

Sammanfattningsvis kan det vara bra att se både void-metoder och variabler/fält utan final som varningsflaggor.

Senast redigerat 2019-08-19 11:07
Skrivet av Xenofonus:

Typ, på hög nivå kanske

Static gör ju så att en variabel eller metod tillhör klassen och inte objekten (går inte göra static outer class, bara inner). Medan Singleton är att det bara finns ett enda objekt instantierat av en klass.

I praktiken så får dom samma minnesadress?

Ska jag då använda mig av DI eller static?

Skrivet av Alling:

public static är inte en egen modifierare. Både public och static kan förekomma utan den andra; det vill säga, du kan ha till exempel public int eller private static int.

Det borde du se som något positivt. Jag får intrycket att du gärna skriver överdrivet objektorienterad/imperativ kod baserad nästan helt på muterbart tillstånd. Sådan kod är ofta svår att uppnå korrekt semantik med, och även om man lyckas tenderar koden att bli så bräcklig att ingen – inte ens man själv – någonsin vågar redigera den.

Försök bygga en större andel av din kod i form av rena funktioner, så blir det lättare för dig att skriva korrekt, begriplig, maintainable kod. Rent konkret ser en ren funktion i Java i praktiken oftast ut så här:

public static Y f(X x) { // Inga sidoeffekter här; enbart beräkning av f(x) baserat på x. }

Ett annat konkret råd är att ha final som utgångsläge på alla variabler/fält, och bara skippa den när variabeln/fältet faktiskt behöver kunna muteras.

Sammanfattningsvis kan det vara bra att se både void-metoder och variabler/fält utan final som varningsflaggor.

Jag tar till mig ditt råd. Jag har som mål att skriva väldigt pedagogisk kod.

Jag finner att om jag har en klass, vars vissa fält tillhör klassen. T.ex. så här

public class DL4JJsonConfiguration { /* * List of strings - Change these? Then you need to change the if-statements in method runConfiguration(Builder builder) below */ private final @Getter String[] updaterList = {"Adam", "Sgd", "AdaMax", "Nesterovs", "AdaDelta"}; private final @Getter String[] regularizationList = {"L1", "L2"}; private final @Getter String[] configurationNames = {"Seed", "Optimization algorithm", "Weight init", "Updater", "Learning rate", "Momentum", "Regularization", "Regularization coefficient"}; /* * Global configuration */ private static @Getter @Setter long seed; private static @Getter @Setter OptimizationAlgorithm optimizationAlgorithm; private static @Getter @Setter WeightInit weightInit; private static @Getter @Setter String updaterName; private static @Getter @Setter double learningRate; private static @Getter @Setter double momentum; private static @Getter @Setter String regularizationName; private static @Getter @Setter double regularizationCoefficient; /* * Layer configuration - They have their "setters" from addLayer() method below */ private static @Getter ArrayList<String> layerList; private static @Getter ArrayList<Integer> nInList; private static @Getter ArrayList<Integer> nOutList; private static @Getter ArrayList<Activation> activationList; private static @Getter ArrayList<LossFunctions.LossFunction> lossFunctionList; /** * Static constructor */ static { layerList = new ArrayList<String>(); nInList = new ArrayList<Integer>(); nOutList = new ArrayList<Integer>(); lossFunctionList = new ArrayList<LossFunctions.LossFunction>(); } ... ... ...

Då ser man uppenbart att denna klass DL4JJsonConfiguration har vissa fält som är "globala" och tillgängliga för allmänheten, så länge man har skapat sitt objekt från klassen så har man tillgång till getters och setters. Det är de facto meningen att man ska komma åt fälten i DL4JJsonConfiguration överallt.

Detta skulle man säkert kunna lösa med Dependency Injection också, men det kräver en IOC-hanterare och massa andra andra bibliotek och kod för att få det att fungera. Sedan vet man inte hur säkert det är mot "threads" eller vad det kallas.

Vad tror du om att ha getters och setters på privata statiska fält?

Skrivet av heretic16:

I praktiken så får dom samma minnesadress?

Ska jag då använda mig av DI eller static?

Ja precis.

Om du behöver hela klassens funktionalitet så är det väl kanske snyggare med DI men om du bara vill åt några enstaka delar ibland så är väl static snyggare, det beror på.

Skrivet av Xenofonus:

Ja precis.

Om du behöver hela klassens funktionalitet så är det väl kanske snyggare med DI men om du bara vill åt några enstaka delar ibland så är väl static snyggare, det beror på.

Okej. Det beror på. Jag bara kollar lite med er övriga erfarna vad ni föredrar. Tackar för svar.

*OT raderat*